isci: kill isci_host list in favor of an array
isci_host_by_id() should have been a clue that an array would have been a simpler approach. Reported-by: James Bottomley <James.Bottomley@suse.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Родитель
52bed8eab5
Коммит
b329aff107
|
@ -78,8 +78,9 @@ irqreturn_t isci_intx_isr(int vec, void *data)
|
|||
struct pci_dev *pdev = data;
|
||||
struct isci_host *ihost;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
int i;
|
||||
|
||||
for_each_isci_host(ihost, pdev) {
|
||||
for_each_isci_host(i, ihost, pdev) {
|
||||
struct scic_sds_controller *scic = ihost->core_controller;
|
||||
|
||||
if (scic_sds_controller_isr(scic)) {
|
||||
|
|
|
@ -117,7 +117,6 @@ struct isci_host {
|
|||
struct list_head requests_to_complete;
|
||||
struct list_head requests_to_abort;
|
||||
spinlock_t scic_lock;
|
||||
struct isci_host *next;
|
||||
};
|
||||
|
||||
|
||||
|
@ -131,7 +130,7 @@ struct isci_host {
|
|||
struct isci_pci_info {
|
||||
struct msix_entry msix_entries[SCI_MAX_MSIX_INT];
|
||||
int core_lib_array_index;
|
||||
struct isci_host *hosts;
|
||||
struct isci_host *hosts[SCI_MAX_CONTROLLERS];
|
||||
};
|
||||
|
||||
static inline struct isci_pci_info *to_pci_info(struct pci_dev *pdev)
|
||||
|
@ -139,9 +138,10 @@ static inline struct isci_pci_info *to_pci_info(struct pci_dev *pdev)
|
|||
return pci_get_drvdata(pdev);
|
||||
}
|
||||
|
||||
#define for_each_isci_host(isci_host, pdev) \
|
||||
for (isci_host = to_pci_info(pdev)->hosts;\
|
||||
isci_host; isci_host = isci_host->next)
|
||||
#define for_each_isci_host(id, ihost, pdev) \
|
||||
for (id = 0, ihost = to_pci_info(pdev)->hosts[id]; \
|
||||
id < ARRAY_SIZE(to_pci_info(pdev)->hosts) && ihost; \
|
||||
ihost = to_pci_info(pdev)->hosts[++id])
|
||||
|
||||
static inline
|
||||
enum isci_status isci_host_get_state(
|
||||
|
|
|
@ -285,16 +285,6 @@ static int __devinit isci_pci_init(struct pci_dev *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct isci_host *isci_host_by_id(struct pci_dev *pdev, int id)
|
||||
{
|
||||
struct isci_host *h;
|
||||
|
||||
for_each_isci_host(h, pdev)
|
||||
if (h->id == id)
|
||||
return h;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int num_controllers(struct pci_dev *pdev)
|
||||
{
|
||||
/* bar size alone can tell us if we are running with a dual controller
|
||||
|
@ -332,7 +322,7 @@ static int isci_setup_interrupts(struct pci_dev *pdev)
|
|||
for (i = 0; i < num_msix; i++) {
|
||||
int id = i / SCI_NUM_MSI_X_INT;
|
||||
struct msix_entry *msix = &pci_info->msix_entries[i];
|
||||
struct isci_host *isci_host = isci_host_by_id(pdev, id);
|
||||
struct isci_host *isci_host = pci_info->hosts[id];
|
||||
irq_handler_t isr;
|
||||
|
||||
/* odd numbered vectors are error interrupts */
|
||||
|
@ -351,7 +341,7 @@ static int isci_setup_interrupts(struct pci_dev *pdev)
|
|||
dev_info(&pdev->dev, "msix setup failed falling back to intx\n");
|
||||
while (i--) {
|
||||
id = i / SCI_NUM_MSI_X_INT;
|
||||
isci_host = isci_host_by_id(pdev, id);
|
||||
isci_host = pci_info->hosts[id];
|
||||
msix = &pci_info->msix_entries[i];
|
||||
devm_free_irq(&pdev->dev, msix->vector, isci_host);
|
||||
}
|
||||
|
@ -634,22 +624,20 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
|
|||
err = -ENOMEM;
|
||||
goto err_host_alloc;
|
||||
}
|
||||
|
||||
h->next = pci_info->hosts;
|
||||
pci_info->hosts = h;
|
||||
pci_info->hosts[i] = h;
|
||||
}
|
||||
|
||||
err = isci_setup_interrupts(pdev);
|
||||
if (err)
|
||||
goto err_host_alloc;
|
||||
|
||||
for_each_isci_host(isci_host, pdev)
|
||||
for_each_isci_host(i, isci_host, pdev)
|
||||
scsi_scan_host(isci_host->shost);
|
||||
|
||||
return 0;
|
||||
|
||||
err_host_alloc:
|
||||
for_each_isci_host(isci_host, pdev)
|
||||
for_each_isci_host(i, isci_host, pdev)
|
||||
isci_unregister_sas_ha(isci_host);
|
||||
return err;
|
||||
}
|
||||
|
@ -657,8 +645,9 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
|
|||
static void __devexit isci_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct isci_host *isci_host;
|
||||
int i;
|
||||
|
||||
for_each_isci_host(isci_host, pdev) {
|
||||
for_each_isci_host(i, isci_host, pdev) {
|
||||
isci_unregister_sas_ha(isci_host);
|
||||
isci_host_deinit(isci_host);
|
||||
scic_controller_disable_interrupts(isci_host->core_controller);
|
||||
|
|
Загрузка…
Ссылка в новой задаче