On 08/09/2017 03:45 PM, Christoph Hellwig wrote:
>> -static int hpsa_lookup_board_id(struct pci_dev *pdev, u32 *board_id)
>> +static int hpsa_lookup_board_id(struct pci_dev *pdev, u32 *board_id,
>> + bool *supported)
>> {
>> int i;
>> u32 subsystem_vendor_id, subsystem_device_id;
>> @@ -7242,9 +7266,22 @@ static int hpsa_lookup_board_id(struct pci_dev *pdev,
>> u32 *board_id)
>> *board_id = ((subsystem_device_id << 16) & 0xffff0000) |
>> subsystem_vendor_id;
>>
>> + if (supported)
>> + *supported = true;
>> for (i = 0; i < ARRAY_SIZE(products); i++)
>> - if (*board_id == products[i].board_id)
>> - return i;
>> + if (*board_id == products[i].board_id) {
>> + if (products[i].access != &SA5A_access &&
>> + products[i].access != &SA5B_access)
>> + return i;
>> + if (hpsa_allow_any) {
>> + dev_warn(&pdev->dev,
>> + "unsupported board ID: 0x%08x\n",
>> + *board_id);
>> + if (supported)
>> + *supported = false;
>> + return i;
>> + }
>> + }
>
> Can you explain the point of the supported flag?
>
'hpsa_allow_any' just enables the _driver_ to bind to older /
unsupported boards, it doesn't tell us if this particular instance is an
old board.
For older boards we should suppress messages from not-implemented
features, whereas on 'real' boards those features should be implemented,
and we should be throwing an error or a warning.
Hence the =supported" flag.
>> + unsigned long register_value =
>> + readl(h->vaddr + SA5_INTR_STATUS);
>> + return (register_value & SA5B_INTR_PENDING);
>
> This should be condensed into:
>
> return readl(h->vaddr + SA5_INTR_STATUS) & SA5B_INTR_PENDING;
>
Yeah; but this is _actually_ just copied over, so other lines will be
affected here, too.
Will be adding a patch for that.
>> .command_completed = SA5_completed,
>> };
>>
>> +/* Duplicate entry of the above to mark unsupported boards */
>> +static struct access_method SA5A_access = {
>> + .submit_command = SA5_submit_command,
>> + .set_intr_mask = SA5_intr_mask,
>> + .intr_pending = SA5_intr_pending,
>> + .command_completed = SA5_completed,
>> +};
>> +
>> +static struct access_method SA5B_access = {
>> + .submit_command = SA5_submit_command,
>> + .set_intr_mask = SA5B_intr_mask,
>> + .intr_pending = SA5B_intr_pending,
>> + .command_completed = SA5_completed,
>> +};
>
> Please align the fields nicely, e.g.:
>
> static struct access_method SA5A_access = {
> .submit_command = SA5_submit_command,
> .set_intr_mask = SA5_intr_mask,
> ...
>
Okay.
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
[email protected] +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)