Commit b329aff1 authored by Dan Williams's avatar Dan Williams

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: default avatarJames Bottomley <James.Bottomley@suse.de>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 52bed8ea
...@@ -78,8 +78,9 @@ irqreturn_t isci_intx_isr(int vec, void *data) ...@@ -78,8 +78,9 @@ irqreturn_t isci_intx_isr(int vec, void *data)
struct pci_dev *pdev = data; struct pci_dev *pdev = data;
struct isci_host *ihost; struct isci_host *ihost;
irqreturn_t ret = IRQ_NONE; 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; struct scic_sds_controller *scic = ihost->core_controller;
if (scic_sds_controller_isr(scic)) { if (scic_sds_controller_isr(scic)) {
......
...@@ -117,7 +117,6 @@ struct isci_host { ...@@ -117,7 +117,6 @@ struct isci_host {
struct list_head requests_to_complete; struct list_head requests_to_complete;
struct list_head requests_to_abort; struct list_head requests_to_abort;
spinlock_t scic_lock; spinlock_t scic_lock;
struct isci_host *next;
}; };
...@@ -131,7 +130,7 @@ struct isci_host { ...@@ -131,7 +130,7 @@ struct isci_host {
struct isci_pci_info { struct isci_pci_info {
struct msix_entry msix_entries[SCI_MAX_MSIX_INT]; struct msix_entry msix_entries[SCI_MAX_MSIX_INT];
int core_lib_array_index; 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) 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) ...@@ -139,9 +138,10 @@ static inline struct isci_pci_info *to_pci_info(struct pci_dev *pdev)
return pci_get_drvdata(pdev); return pci_get_drvdata(pdev);
} }
#define for_each_isci_host(isci_host, pdev) \ #define for_each_isci_host(id, ihost, pdev) \
for (isci_host = to_pci_info(pdev)->hosts;\ for (id = 0, ihost = to_pci_info(pdev)->hosts[id]; \
isci_host; isci_host = isci_host->next) id < ARRAY_SIZE(to_pci_info(pdev)->hosts) && ihost; \
ihost = to_pci_info(pdev)->hosts[++id])
static inline static inline
enum isci_status isci_host_get_state( enum isci_status isci_host_get_state(
......
...@@ -285,16 +285,6 @@ static int __devinit isci_pci_init(struct pci_dev *pdev) ...@@ -285,16 +285,6 @@ static int __devinit isci_pci_init(struct pci_dev *pdev)
return 0; 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) static int num_controllers(struct pci_dev *pdev)
{ {
/* bar size alone can tell us if we are running with a dual controller /* 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) ...@@ -332,7 +322,7 @@ static int isci_setup_interrupts(struct pci_dev *pdev)
for (i = 0; i < num_msix; i++) { for (i = 0; i < num_msix; i++) {
int id = i / SCI_NUM_MSI_X_INT; int id = i / SCI_NUM_MSI_X_INT;
struct msix_entry *msix = &pci_info->msix_entries[i]; 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; irq_handler_t isr;
/* odd numbered vectors are error interrupts */ /* odd numbered vectors are error interrupts */
...@@ -351,7 +341,7 @@ static int isci_setup_interrupts(struct pci_dev *pdev) ...@@ -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"); dev_info(&pdev->dev, "msix setup failed falling back to intx\n");
while (i--) { while (i--) {
id = i / SCI_NUM_MSI_X_INT; 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]; msix = &pci_info->msix_entries[i];
devm_free_irq(&pdev->dev, msix->vector, isci_host); 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 ...@@ -634,22 +624,20 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
err = -ENOMEM; err = -ENOMEM;
goto err_host_alloc; goto err_host_alloc;
} }
pci_info->hosts[i] = h;
h->next = pci_info->hosts;
pci_info->hosts = h;
} }
err = isci_setup_interrupts(pdev); err = isci_setup_interrupts(pdev);
if (err) if (err)
goto err_host_alloc; 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); scsi_scan_host(isci_host->shost);
return 0; return 0;
err_host_alloc: err_host_alloc:
for_each_isci_host(isci_host, pdev) for_each_isci_host(i, isci_host, pdev)
isci_unregister_sas_ha(isci_host); isci_unregister_sas_ha(isci_host);
return err; return err;
} }
...@@ -657,8 +645,9 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic ...@@ -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) static void __devexit isci_pci_remove(struct pci_dev *pdev)
{ {
struct isci_host *isci_host; 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_unregister_sas_ha(isci_host);
isci_host_deinit(isci_host); isci_host_deinit(isci_host);
scic_controller_disable_interrupts(isci_host->core_controller); scic_controller_disable_interrupts(isci_host->core_controller);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment