From 0e930f437eab6db6de5e3f0efbf10dafffca401a Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Fri, 8 Sep 2006 01:30:04 +0200 Subject: ieee1394: remove unused struct member from highlevel API struct hpsb_highlevel's struct module *owner is neither used by the IEEE 1394 core nor set by any of the in-tree drivers or the two out-of-tree highlevel drivers I know about (dfg1394, mem1394) --- nor is this member documented. An unscheduled removal seems acceptable. Signed-off-by: Stefan Richter --- drivers/ieee1394/highlevel.h | 1 - 1 file changed, 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/highlevel.h b/drivers/ieee1394/highlevel.h index 50f2dd2..4b33011 100644 --- a/drivers/ieee1394/highlevel.h +++ b/drivers/ieee1394/highlevel.h @@ -24,7 +24,6 @@ struct hpsb_address_serve { /* Only the following structures are of interest to actual highlevel drivers. */ struct hpsb_highlevel { - struct module *owner; const char *name; /* Any of the following pointers can legally be NULL, except for -- cgit v1.1 From 23077f1d72d279244536f11db51258fc4759c81a Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Mon, 11 Sep 2006 20:17:14 +0200 Subject: ieee1394: sbp2: slightly reorder sbp2scsi_abort Put the target's fetch agent into reset state before the underlying ORB DMA is unmapped and the ->done handler is called. It is highly unlikely but the target could access that ORB right before sbp2 sends the reset request. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index cd156d4..e5ba55b 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -2564,11 +2564,9 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) scsi_print_command(SCpnt); if (sbp2util_node_is_available(scsi_id)) { + sbp2_agent_reset(scsi_id, 1); - /* - * Right now, just return any matching command structures - * to the free pool. - */ + /* Return a matching command structure to the free pool. */ spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); command = sbp2util_find_command_for_SCpnt(scsi_id, SCpnt); if (command) { @@ -2589,10 +2587,6 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) } spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); - /* - * Initiate a fetch agent reset. - */ - sbp2_agent_reset(scsi_id, 1); sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY); } -- cgit v1.1 From f9edc4f5c1dd9fab5ceedd69e77d20e508e41e8d Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 14 Sep 2006 22:06:48 +0200 Subject: ieee1394: raw1394: add comments on lock usage Add a who-is-who about some locks and list heads in raw1394's struct definitions. Signed-off-by: Stefan Richter --- drivers/ieee1394/raw1394-private.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/raw1394-private.h b/drivers/ieee1394/raw1394-private.h index c7731d1..50daabf 100644 --- a/drivers/ieee1394/raw1394-private.h +++ b/drivers/ieee1394/raw1394-private.h @@ -27,12 +27,12 @@ struct file_info { struct hpsb_host *host; - struct list_head req_pending; - struct list_head req_complete; + struct list_head req_pending; /* protected by reqlists_lock */ + struct list_head req_complete; /* protected by reqlists_lock */ spinlock_t reqlists_lock; wait_queue_head_t wait_complete; - struct list_head addr_list; + struct list_head addr_list; /* protected by host_info_lock */ u8 __user *fcp_buffer; @@ -63,7 +63,7 @@ struct arm_addr { u8 client_transactions; u64 recvb; u16 rec_length; - u8 *addr_space_buffer; /* accessed by read/write/lock */ + u8 *addr_space_buffer; /* accessed by read/write/lock requests */ }; struct pending_request { @@ -79,7 +79,7 @@ struct pending_request { struct host_info { struct list_head list; struct hpsb_host *host; - struct list_head file_info_list; + struct list_head file_info_list; /* protected by host_info_lock */ }; #endif /* IEEE1394_RAW1394_PRIVATE_H */ -- cgit v1.1 From f011bf085cd41ee40c2c8e530f801ac6cb6e00d0 Mon Sep 17 00:00:00 2001 From: Bernhard Kaindl Date: Wed, 6 Sep 2006 14:58:30 +0200 Subject: ohci1394: steps to implement suspend/resume I did a quick shot on what I described and the appended patch does the first thing needed for working suspend/resume in ohci1394 which is HW de- and re-initialisation. It works with suspend2disk on my Ricoh R5C552 IEEE 1394 Controller with the 2.6.17 kernel to the extent that if I call dvgrab --interactive after suspend2disk without unloading ohci1394, it does not lock up dvgrab with 100% CPU but properly connects to the camera, given that I first unplug and plug the camera after coming back from suspend. I guess that could be fixed by forcing a bus reset in the resume function. I cannot test suspend to RAM here at the moment and should follow the guidelines in Documentation/power/pci.txt also, so this is rather a quick report than a finished patch and there are some rough edges: However, with this patch, I have to unload at least some in-kernel users of ohci1394 like dv1394 or video1394 before suspending. Not doing that caused an Oops and a bad tasklet error, probably from not handling ISO tasklets during suspend/resume properly. Maybe these can be temporarily cleared or unregistered and re-registered for suspend/resume with help from the other layers or from the highlevel 1394 core, but I do not really know what these do. But this patch provides a useful base to start from and is already of much help for people which do not need dv1394 and video1394 or can unload them at least during suspend. I cannot test function with sbp2 at the moment, but raw1394 seems to work fine. Signed-off-by: Bernhard Kaindl Update 1: merge with previous two ohci1394 suspend/resume patches Update 2: version for application on top of Linux 2.6.19-rc4 Signed-off-by: Stefan Richter --- drivers/ieee1394/ohci1394.c | 92 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 14 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index eae97d8..b98b993 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c @@ -3531,6 +3531,9 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) #ifdef CONFIG_PM static int ohci1394_pci_resume (struct pci_dev *pdev) { + int err; + struct ti_ohci *ohci; + /* PowerMac resume code comes first */ #ifdef CONFIG_PPC_PMAC if (machine_is(powermac)) { @@ -3545,28 +3548,89 @@ static int ohci1394_pci_resume (struct pci_dev *pdev) pci_set_power_state(pdev, PCI_D0); pci_restore_state(pdev); - return pci_enable_device(pdev); + err = pci_enable_device(pdev); + if (err) + return err; + + ohci = pci_get_drvdata(pdev); + if (!ohci) + return -1; /* or which exit status to use? */ + + PRINT(KERN_DEBUG, "resume called"); + + /* The following lines are copied from ohci1394_pci_probe(): */ + + /* Start off with a soft reset, to clear everything to a sane + * state. */ + ohci_soft_reset(ohci); + + /* Now enable LPS, which we need in order to start accessing + * most of the registers. In fact, on some cards (ALI M5251), + * accessing registers in the SClk domain without LPS enabled + * will lock up the machine. Wait 50msec to make sure we have + * full link enabled. */ + reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_LPS); + + /* Disable and clear interrupts */ + reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff); + reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff); + + mdelay(50); + + ohci_initialize(ohci); + + return 0; } static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state) { int err; + struct ti_ohci *ohci; + + ohci = pci_get_drvdata(pdev); + if (!ohci) + return -1; /* Not sure if this is the correct return code */ + + PRINT(KERN_DEBUG, "suspend called"); + + /* clear the async DMA contexts and stop using the controller: */ + hpsb_bus_reset(ohci->host); + + /* The following calls are from ohci1394_pci_remove(): */ - printk(KERN_INFO "%s does not fully support suspend and resume yet\n", - OHCI1394_DRIVER_NAME); + /* Clear out BUS Options */ + reg_write(ohci, OHCI1394_ConfigROMhdr, 0); + reg_write(ohci, OHCI1394_BusOptions, + (reg_read(ohci, OHCI1394_BusOptions) & 0x0000f007) | + 0x00ff0000); + + /* Clear interrupt registers */ + reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff); + reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff); + reg_write(ohci, OHCI1394_IsoXmitIntMaskClear, 0xffffffff); + reg_write(ohci, OHCI1394_IsoXmitIntEventClear, 0xffffffff); + reg_write(ohci, OHCI1394_IsoRecvIntMaskClear, 0xffffffff); + reg_write(ohci, OHCI1394_IsoRecvIntEventClear, 0xffffffff); + + /* Disable IRM Contender */ + set_phy_reg(ohci, 4, ~0xc0 & get_phy_reg(ohci, 4)); + + /* Clear link control register */ + reg_write(ohci, OHCI1394_LinkControlClear, 0xffffffff); + + /* Let all other nodes know to ignore us */ + ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT); + + /* This stops all DMA contexts, disables interrupts, + * and clears linkEnable and LPS: */ + ohci_soft_reset(ohci); err = pci_save_state(pdev); - if (err) { - printk(KERN_ERR "%s: pci_save_state failed with %d\n", - OHCI1394_DRIVER_NAME, err); - return err; - } + if (err) + goto out; err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); -#ifdef OHCI1394_DEBUG if (err) - printk(KERN_DEBUG "%s: pci_set_power_state failed with %d\n", - OHCI1394_DRIVER_NAME, err); -#endif /* OHCI1394_DEBUG */ + goto out; /* PowerMac suspend code comes last */ #ifdef CONFIG_PPC_PMAC @@ -3579,8 +3643,8 @@ static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state) pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0); } #endif /* CONFIG_PPC_PMAC */ - - return 0; +out: + return err; } #endif /* CONFIG_PM */ -- cgit v1.1 From da256c55373cbc45e30f868e0bddb81ddc4067bf Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 24 Sep 2006 11:01:00 +0200 Subject: ieee1394: ohci1394: suspend/resume cosmetics Reorder the definitions of ohci1394_pci_suspend and _resume. Remove redundant comments. Beautify return statements. Signed-off-by: Stefan Richter --- drivers/ieee1394/ohci1394.c | 126 +++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 78 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index b98b993..a128025 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c @@ -3529,108 +3529,40 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) } #ifdef CONFIG_PM -static int ohci1394_pci_resume (struct pci_dev *pdev) +static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) { int err; - struct ti_ohci *ohci; - -/* PowerMac resume code comes first */ -#ifdef CONFIG_PPC_PMAC - if (machine_is(powermac)) { - struct device_node *of_node; - - /* Re-enable 1394 */ - of_node = pci_device_to_OF_node (pdev); - if (of_node) - pmac_call_feature (PMAC_FTR_1394_ENABLE, of_node, 0, 1); - } -#endif /* CONFIG_PPC_PMAC */ - - pci_set_power_state(pdev, PCI_D0); - pci_restore_state(pdev); - err = pci_enable_device(pdev); - if (err) - return err; - - ohci = pci_get_drvdata(pdev); - if (!ohci) - return -1; /* or which exit status to use? */ - - PRINT(KERN_DEBUG, "resume called"); - - /* The following lines are copied from ohci1394_pci_probe(): */ - - /* Start off with a soft reset, to clear everything to a sane - * state. */ - ohci_soft_reset(ohci); - - /* Now enable LPS, which we need in order to start accessing - * most of the registers. In fact, on some cards (ALI M5251), - * accessing registers in the SClk domain without LPS enabled - * will lock up the machine. Wait 50msec to make sure we have - * full link enabled. */ - reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_LPS); - - /* Disable and clear interrupts */ - reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff); - reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff); - - mdelay(50); - - ohci_initialize(ohci); - - return 0; -} - -static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state) -{ - int err; - struct ti_ohci *ohci; - - ohci = pci_get_drvdata(pdev); - if (!ohci) - return -1; /* Not sure if this is the correct return code */ + struct ti_ohci *ohci = pci_get_drvdata(pdev); PRINT(KERN_DEBUG, "suspend called"); + if (!ohci) + return -ENXIO; - /* clear the async DMA contexts and stop using the controller: */ + /* Clear the async DMA contexts and stop using the controller */ hpsb_bus_reset(ohci->host); - /* The following calls are from ohci1394_pci_remove(): */ - - /* Clear out BUS Options */ + /* See ohci1394_pci_remove() for comments on this sequence */ reg_write(ohci, OHCI1394_ConfigROMhdr, 0); reg_write(ohci, OHCI1394_BusOptions, (reg_read(ohci, OHCI1394_BusOptions) & 0x0000f007) | 0x00ff0000); - - /* Clear interrupt registers */ reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff); reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff); reg_write(ohci, OHCI1394_IsoXmitIntMaskClear, 0xffffffff); reg_write(ohci, OHCI1394_IsoXmitIntEventClear, 0xffffffff); reg_write(ohci, OHCI1394_IsoRecvIntMaskClear, 0xffffffff); reg_write(ohci, OHCI1394_IsoRecvIntEventClear, 0xffffffff); - - /* Disable IRM Contender */ set_phy_reg(ohci, 4, ~0xc0 & get_phy_reg(ohci, 4)); - - /* Clear link control register */ reg_write(ohci, OHCI1394_LinkControlClear, 0xffffffff); - - /* Let all other nodes know to ignore us */ ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT); - - /* This stops all DMA contexts, disables interrupts, - * and clears linkEnable and LPS: */ ohci_soft_reset(ohci); err = pci_save_state(pdev); if (err) - goto out; + return err; err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); if (err) - goto out; + return err; /* PowerMac suspend code comes last */ #ifdef CONFIG_PPC_PMAC @@ -3643,8 +3575,46 @@ static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state) pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0); } #endif /* CONFIG_PPC_PMAC */ -out: - return err; + + return 0; +} + +static int ohci1394_pci_resume(struct pci_dev *pdev) +{ + int err; + struct ti_ohci *ohci = pci_get_drvdata(pdev); + + PRINT(KERN_DEBUG, "resume called"); + if (!ohci) + return -ENXIO; + +/* PowerMac resume code comes first */ +#ifdef CONFIG_PPC_PMAC + if (machine_is(powermac)) { + struct device_node *of_node; + + /* Re-enable 1394 */ + of_node = pci_device_to_OF_node (pdev); + if (of_node) + pmac_call_feature (PMAC_FTR_1394_ENABLE, of_node, 0, 1); + } +#endif /* CONFIG_PPC_PMAC */ + + pci_set_power_state(pdev, PCI_D0); + pci_restore_state(pdev); + err = pci_enable_device(pdev); + if (err) + return err; + + /* See ohci1394_pci_probe() for comments on this sequence */ + ohci_soft_reset(ohci); + reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_LPS); + reg_write(ohci, OHCI1394_IntEventClear, 0xffffffff); + reg_write(ohci, OHCI1394_IntMaskClear, 0xffffffff); + mdelay(50); + ohci_initialize(ohci); + + return 0; } #endif /* CONFIG_PM */ -- cgit v1.1 From b63d4fe95f29b6cadffcee8cdabd8435e8560cde Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 8 Oct 2006 11:45:13 +0200 Subject: ieee1394: usecs_to_jiffies takes unsigned int argument Signed-off-by: Stefan Richter --- drivers/ieee1394/csr.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/csr.c b/drivers/ieee1394/csr.c index ab0c80f..52ac83e 100644 --- a/drivers/ieee1394/csr.c +++ b/drivers/ieee1394/csr.c @@ -158,12 +158,10 @@ static void host_reset(struct hpsb_host *host) */ static inline void calculate_expire(struct csr_control *csr) { - unsigned long usecs = - (csr->split_timeout_hi & 0x07) * USEC_PER_SEC + - (csr->split_timeout_lo >> 19) * 125L; - - csr->expire = usecs_to_jiffies(usecs > 100000L ? usecs : 100000L); + unsigned int usecs = (csr->split_timeout_hi & 7) * 1000000 + + (csr->split_timeout_lo >> 19) * 125; + csr->expire = usecs_to_jiffies(usecs > 100000 ? usecs : 100000); HPSB_VERBOSE("CSR: setting expire to %lu, HZ=%u", csr->expire, HZ); } -- cgit v1.1 From 5c37dcbe138ed3239c5e8b6c2626ce773a7cea2e Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Tue, 10 Oct 2006 21:11:43 +0200 Subject: ieee1394: lock smaller region by host_num_alloc mutex We need the mutex only around the iteration over existing hosts. Signed-off-by: Stefan Richter --- drivers/ieee1394/hosts.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/hosts.c b/drivers/ieee1394/hosts.c index b935e08..25573ba 100644 --- a/drivers/ieee1394/hosts.c +++ b/drivers/ieee1394/hosts.c @@ -157,10 +157,9 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra, h->speed_map = (u8 *)(h->csr.speed_map + 2); mutex_lock(&host_num_alloc); - while (nodemgr_for_each_host(&hostnum, alloc_hostnum_cb)) hostnum++; - + mutex_unlock(&host_num_alloc); h->id = hostnum; memcpy(&h->device, &nodemgr_dev_template_host, sizeof(h->device)); @@ -175,8 +174,6 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra, class_device_register(&h->class_dev); get_device(&h->device); - mutex_unlock(&host_num_alloc); - return h; } -- cgit v1.1 From 1ed891c6d49e97ebd3305d8c6213246a14f0800f Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Tue, 10 Oct 2006 21:12:39 +0200 Subject: ieee1394: coding style in hosts.c Some 80-columns pedantry, and touch up of a // comment. Signed-off-by: Stefan Richter --- drivers/ieee1394/hosts.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/hosts.c b/drivers/ieee1394/hosts.c index 25573ba..fbf17cf 100644 --- a/drivers/ieee1394/hosts.c +++ b/drivers/ieee1394/hosts.c @@ -44,9 +44,10 @@ static void delayed_reset_bus(struct work_struct *work) CSR_SET_BUS_INFO_GENERATION(host->csr.rom, generation); if (csr1212_generate_csr_image(host->csr.rom) != CSR1212_SUCCESS) { - /* CSR image creation failed, reset generation field and do not - * issue a bus reset. */ - CSR_SET_BUS_INFO_GENERATION(host->csr.rom, host->csr.generation); + /* CSR image creation failed. + * Reset generation field and do not issue a bus reset. */ + CSR_SET_BUS_INFO_GENERATION(host->csr.rom, + host->csr.generation); return; } @@ -54,7 +55,8 @@ static void delayed_reset_bus(struct work_struct *work) host->update_config_rom = 0; if (host->driver->set_hw_config_rom) - host->driver->set_hw_config_rom(host, host->csr.rom->bus_info_data); + host->driver->set_hw_config_rom(host, + host->csr.rom->bus_info_data); host->csr.gen_timestamp[host->csr.generation] = jiffies; hpsb_reset_bus(host, SHORT_RESET); @@ -70,7 +72,8 @@ static int dummy_devctl(struct hpsb_host *h, enum devctl_cmd c, int arg) return -1; } -static int dummy_isoctl(struct hpsb_iso *iso, enum isoctl_cmd command, unsigned long arg) +static int dummy_isoctl(struct hpsb_iso *iso, enum isoctl_cmd command, + unsigned long arg) { return -1; } @@ -151,7 +154,7 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra, init_timer(&h->timeout); h->timeout.data = (unsigned long) h; h->timeout.function = abort_timedouts; - h->timeout_interval = HZ / 20; // 50ms by default + h->timeout_interval = HZ / 20; /* 50ms, half of minimum SPLIT_TIMEOUT */ h->topology_map = h->csr.topology_map + 3; h->speed_map = (u8 *)(h->csr.speed_map + 2); @@ -226,7 +229,8 @@ int hpsb_update_config_rom_image(struct hpsb_host *host) if (time_before(jiffies, host->csr.gen_timestamp[next_gen] + 60 * HZ)) /* Wait 60 seconds from the last time this generation number was * used. */ - reset_delay = (60 * HZ) + host->csr.gen_timestamp[next_gen] - jiffies; + reset_delay = + (60 * HZ) + host->csr.gen_timestamp[next_gen] - jiffies; else /* Wait 1 second in case some other code wants to change the * Config ROM in the near future. */ -- cgit v1.1 From c1c9c7cd9f33ad6ff4407638060fe2730560bd56 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Tue, 10 Oct 2006 21:19:21 +0200 Subject: ieee1394: handle sysfs errors Handle driver core errors with as much care as appropriate. Signed-off-by: Stefan Richter --- drivers/ieee1394/hosts.c | 18 ++++-- drivers/ieee1394/nodemgr.c | 149 ++++++++++++++++++++++++++++++++------------- 2 files changed, 118 insertions(+), 49 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/hosts.c b/drivers/ieee1394/hosts.c index fbf17cf..ee82a53 100644 --- a/drivers/ieee1394/hosts.c +++ b/drivers/ieee1394/hosts.c @@ -131,10 +131,8 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra, return NULL; h->csr.rom = csr1212_create_csr(&csr_bus_ops, CSR_BUS_INFO_SIZE, h); - if (!h->csr.rom) { - kfree(h); - return NULL; - } + if (!h->csr.rom) + goto fail; h->hostdata = h + 1; h->driver = drv; @@ -173,11 +171,19 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra, h->class_dev.class = &hpsb_host_class; snprintf(h->class_dev.class_id, BUS_ID_SIZE, "fw-host%d", h->id); - device_register(&h->device); - class_device_register(&h->class_dev); + if (device_register(&h->device)) + goto fail; + if (class_device_register(&h->class_dev)) { + device_unregister(&h->device); + goto fail; + } get_device(&h->device); return h; + +fail: + kfree(h); + return NULL; } int hpsb_add_host(struct hpsb_host *host) diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index e829c93..e95fe40 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -413,11 +413,14 @@ static ssize_t fw_get_destroy_node(struct bus_type *bus, char *buf) static BUS_ATTR(destroy_node, S_IWUSR | S_IRUGO, fw_get_destroy_node, fw_set_destroy_node); -static ssize_t fw_set_rescan(struct bus_type *bus, const char *buf, size_t count) +static ssize_t fw_set_rescan(struct bus_type *bus, const char *buf, + size_t count) { + int error = 0; + if (simple_strtoul(buf, NULL, 10) == 1) - bus_rescan_devices(&ieee1394_bus_type); - return count; + error = bus_rescan_devices(&ieee1394_bus_type); + return error ? error : count; } static ssize_t fw_get_rescan(struct bus_type *bus, char *buf) { @@ -583,7 +586,11 @@ static void nodemgr_create_drv_files(struct hpsb_protocol_driver *driver) int i; for (i = 0; i < ARRAY_SIZE(fw_drv_attrs); i++) - driver_create_file(drv, fw_drv_attrs[i]); + if (driver_create_file(drv, fw_drv_attrs[i])) + goto fail; + return; +fail: + HPSB_ERR("Failed to add sysfs attribute for driver %s", driver->name); } @@ -603,7 +610,12 @@ static void nodemgr_create_ne_dev_files(struct node_entry *ne) int i; for (i = 0; i < ARRAY_SIZE(fw_ne_attrs); i++) - device_create_file(dev, fw_ne_attrs[i]); + if (device_create_file(dev, fw_ne_attrs[i])) + goto fail; + return; +fail: + HPSB_ERR("Failed to add sysfs attribute for node %016Lx", + (unsigned long long)ne->guid); } @@ -613,11 +625,16 @@ static void nodemgr_create_host_dev_files(struct hpsb_host *host) int i; for (i = 0; i < ARRAY_SIZE(fw_host_attrs); i++) - device_create_file(dev, fw_host_attrs[i]); + if (device_create_file(dev, fw_host_attrs[i])) + goto fail; + return; +fail: + HPSB_ERR("Failed to add sysfs attribute for host %d", host->id); } -static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host, nodeid_t nodeid); +static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host, + nodeid_t nodeid); static void nodemgr_update_host_dev_links(struct hpsb_host *host) { @@ -628,12 +645,18 @@ static void nodemgr_update_host_dev_links(struct hpsb_host *host) sysfs_remove_link(&dev->kobj, "busmgr_id"); sysfs_remove_link(&dev->kobj, "host_id"); - if ((ne = find_entry_by_nodeid(host, host->irm_id))) - sysfs_create_link(&dev->kobj, &ne->device.kobj, "irm_id"); - if ((ne = find_entry_by_nodeid(host, host->busmgr_id))) - sysfs_create_link(&dev->kobj, &ne->device.kobj, "busmgr_id"); - if ((ne = find_entry_by_nodeid(host, host->node_id))) - sysfs_create_link(&dev->kobj, &ne->device.kobj, "host_id"); + if ((ne = find_entry_by_nodeid(host, host->irm_id)) && + sysfs_create_link(&dev->kobj, &ne->device.kobj, "irm_id")) + goto fail; + if ((ne = find_entry_by_nodeid(host, host->busmgr_id)) && + sysfs_create_link(&dev->kobj, &ne->device.kobj, "busmgr_id")) + goto fail; + if ((ne = find_entry_by_nodeid(host, host->node_id)) && + sysfs_create_link(&dev->kobj, &ne->device.kobj, "host_id")) + goto fail; + return; +fail: + HPSB_ERR("Failed to update sysfs attributes for host %d", host->id); } static void nodemgr_create_ud_dev_files(struct unit_directory *ud) @@ -642,25 +665,32 @@ static void nodemgr_create_ud_dev_files(struct unit_directory *ud) int i; for (i = 0; i < ARRAY_SIZE(fw_ud_attrs); i++) - device_create_file(dev, fw_ud_attrs[i]); - + if (device_create_file(dev, fw_ud_attrs[i])) + goto fail; if (ud->flags & UNIT_DIRECTORY_SPECIFIER_ID) - device_create_file(dev, &dev_attr_ud_specifier_id); - + if (device_create_file(dev, &dev_attr_ud_specifier_id)) + goto fail; if (ud->flags & UNIT_DIRECTORY_VERSION) - device_create_file(dev, &dev_attr_ud_version); - + if (device_create_file(dev, &dev_attr_ud_version)) + goto fail; if (ud->flags & UNIT_DIRECTORY_VENDOR_ID) { - device_create_file(dev, &dev_attr_ud_vendor_id); - if (ud->vendor_name_kv) - device_create_file(dev, &dev_attr_ud_vendor_name_kv); + if (device_create_file(dev, &dev_attr_ud_vendor_id)) + goto fail; + if (ud->vendor_name_kv && + device_create_file(dev, &dev_attr_ud_vendor_name_kv)) + goto fail; } - if (ud->flags & UNIT_DIRECTORY_MODEL_ID) { - device_create_file(dev, &dev_attr_ud_model_id); - if (ud->model_name_kv) - device_create_file(dev, &dev_attr_ud_model_name_kv); + if (device_create_file(dev, &dev_attr_ud_model_id)) + goto fail; + if (ud->model_name_kv && + device_create_file(dev, &dev_attr_ud_model_name_kv)) + goto fail; } + return; +fail: + HPSB_ERR("Failed to add sysfs attributes for unit %s", + ud->device.bus_id); } @@ -748,7 +778,7 @@ static int __nodemgr_remove_host_dev(struct device *dev, void *data) static void nodemgr_remove_host_dev(struct device *dev) { - device_for_each_child(dev, NULL, __nodemgr_remove_host_dev); + WARN_ON(device_for_each_child(dev, NULL, __nodemgr_remove_host_dev)); sysfs_remove_link(&dev->kobj, "irm_id"); sysfs_remove_link(&dev->kobj, "busmgr_id"); sysfs_remove_link(&dev->kobj, "host_id"); @@ -792,7 +822,7 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr ne = kzalloc(sizeof(*ne), GFP_KERNEL); if (!ne) - return NULL; + goto fail_alloc; ne->host = host; ne->nodeid = nodeid; @@ -815,12 +845,15 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr snprintf(ne->class_dev.class_id, BUS_ID_SIZE, "%016Lx", (unsigned long long)(ne->guid)); - device_register(&ne->device); - class_device_register(&ne->class_dev); + if (device_register(&ne->device)) + goto fail_devreg; + if (class_device_register(&ne->class_dev)) + goto fail_classdevreg; get_device(&ne->device); - if (ne->guid_vendor_oui) - device_create_file(&ne->device, &dev_attr_ne_guid_vendor_oui); + if (ne->guid_vendor_oui && + device_create_file(&ne->device, &dev_attr_ne_guid_vendor_oui)) + goto fail_addoiu; nodemgr_create_ne_dev_files(ne); nodemgr_update_bus_options(ne); @@ -830,6 +863,18 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr NODE_BUS_ARGS(host, nodeid), (unsigned long long)guid); return ne; + +fail_addoiu: + put_device(&ne->device); +fail_classdevreg: + device_unregister(&ne->device); +fail_devreg: + kfree(ne); +fail_alloc: + HPSB_ERR("Failed to create node ID:BUS[" NODE_BUS_FMT "] GUID[%016Lx]", + NODE_BUS_ARGS(host, nodeid), (unsigned long long)guid); + + return NULL; } @@ -891,13 +936,25 @@ static void nodemgr_register_device(struct node_entry *ne, snprintf(ud->class_dev.class_id, BUS_ID_SIZE, "%s-%u", ne->device.bus_id, ud->id); - device_register(&ud->device); - class_device_register(&ud->class_dev); + if (device_register(&ud->device)) + goto fail_devreg; + if (class_device_register(&ud->class_dev)) + goto fail_classdevreg; get_device(&ud->device); - if (ud->vendor_oui) - device_create_file(&ud->device, &dev_attr_ud_vendor_oui); + if (ud->vendor_oui && + device_create_file(&ud->device, &dev_attr_ud_vendor_oui)) + goto fail_addoui; nodemgr_create_ud_dev_files(ud); + + return; + +fail_addoui: + put_device(&ud->device); +fail_classdevreg: + device_unregister(&ud->device); +fail_devreg: + HPSB_ERR("Failed to create unit %s", ud->device.bus_id); } @@ -1094,10 +1151,16 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent last_key_id = kv->key.id; } - if (ne->vendor_oui) - device_create_file(&ne->device, &dev_attr_ne_vendor_oui); - if (ne->vendor_name_kv) - device_create_file(&ne->device, &dev_attr_ne_vendor_name_kv); + if (ne->vendor_oui && + device_create_file(&ne->device, &dev_attr_ne_vendor_oui)) + goto fail; + if (ne->vendor_name_kv && + device_create_file(&ne->device, &dev_attr_ne_vendor_name_kv)) + goto fail; + return; +fail: + HPSB_ERR("Failed to add sysfs attribute for node %016Lx", + (unsigned long long)ne->guid); } #ifdef CONFIG_HOTPLUG @@ -1170,7 +1233,7 @@ int hpsb_register_protocol(struct hpsb_protocol_driver *driver) if (!ret) nodemgr_create_drv_files(driver); - return ret; + return 0; } void hpsb_unregister_protocol(struct hpsb_protocol_driver *driver) @@ -1327,7 +1390,7 @@ static void nodemgr_suspend_ne(struct node_entry *ne) NODE_BUS_ARGS(ne->host, ne->nodeid), (unsigned long long)ne->guid); ne->in_limbo = 1; - device_create_file(&ne->device, &dev_attr_ne_in_limbo); + WARN_ON(device_create_file(&ne->device, &dev_attr_ne_in_limbo)); down_write(&ne->device.bus->subsys.rwsem); list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { @@ -1498,7 +1561,7 @@ static void nodemgr_node_probe(struct host_info *hi, int generation) * just removed. */ if (generation == get_hpsb_generation(host)) - bus_rescan_devices(&ieee1394_bus_type); + WARN_ON(bus_rescan_devices(&ieee1394_bus_type)); return; } -- cgit v1.1 From 3c21cfc4babaf4d20384f6f70def308e9b945159 Mon Sep 17 00:00:00 2001 From: Daniel Drake Date: Wed, 18 Oct 2006 21:37:14 +0100 Subject: video1394: small optimizations to frame retrieval codepath Add some GCC branch prediction optimizations to unlikely error/safety conditions in the ioctl handling code commonly called during an application's capture loop. Signed-off-by: Daniel Drake Signed-off-by: Stefan Richter --- drivers/ieee1394/video1394.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c index 9bc6505..776b661 100644 --- a/drivers/ieee1394/video1394.c +++ b/drivers/ieee1394/video1394.c @@ -884,13 +884,14 @@ static int __video1394_ioctl(struct file *file, struct dma_iso_ctx *d; int next_prg; - if (copy_from_user(&v, argp, sizeof(v))) + if (unlikely(copy_from_user(&v, argp, sizeof(v)))) return -EFAULT; d = find_ctx(&ctx->context_list, OHCI_ISO_RECEIVE, v.channel); - if (d == NULL) return -EFAULT; + if (unlikely(d == NULL)) + return -EFAULT; - if ((v.buffer<0) || (v.buffer>=d->num_desc - 1)) { + if (unlikely((v.buffer<0) || (v.buffer>=d->num_desc - 1))) { PRINT(KERN_ERR, ohci->host->id, "Buffer %d out of range",v.buffer); return -EINVAL; @@ -898,7 +899,7 @@ static int __video1394_ioctl(struct file *file, spin_lock_irqsave(&d->lock,flags); - if (d->buffer_status[v.buffer]==VIDEO1394_BUFFER_QUEUED) { + if (unlikely(d->buffer_status[v.buffer]==VIDEO1394_BUFFER_QUEUED)) { PRINT(KERN_ERR, ohci->host->id, "Buffer %d is already used",v.buffer); spin_unlock_irqrestore(&d->lock,flags); @@ -949,13 +950,14 @@ static int __video1394_ioctl(struct file *file, struct dma_iso_ctx *d; int i = 0; - if (copy_from_user(&v, argp, sizeof(v))) + if (unlikely(copy_from_user(&v, argp, sizeof(v)))) return -EFAULT; d = find_ctx(&ctx->context_list, OHCI_ISO_RECEIVE, v.channel); - if (d == NULL) return -EFAULT; + if (unlikely(d == NULL)) + return -EFAULT; - if ((v.buffer<0) || (v.buffer>d->num_desc - 1)) { + if (unlikely((v.buffer<0) || (v.buffer>d->num_desc - 1))) { PRINT(KERN_ERR, ohci->host->id, "Buffer %d out of range",v.buffer); return -EINVAL; @@ -1008,7 +1010,7 @@ static int __video1394_ioctl(struct file *file, spin_unlock_irqrestore(&d->lock, flags); v.buffer=i; - if (copy_to_user(argp, &v, sizeof(v))) + if (unlikely(copy_to_user(argp, &v, sizeof(v)))) return -EFAULT; return 0; -- cgit v1.1 From 75dcf5dc5a0dc4e895944368780cc2fc40008a55 Mon Sep 17 00:00:00 2001 From: Daniel Drake Date: Fri, 20 Oct 2006 14:56:01 +0100 Subject: video1394: remove BKL contention video1394 does not need to take the BKL. The data structures shared between file_operations and interrupts are already protected through context-specific spinlocks. The only other danger is video1394_release() being called during another operation, however this cannot happen because release is only ever invoked when the last thread has closed the fd. Signed-off-by: Daniel Drake Signed-off-by: Stefan Richter --- drivers/ieee1394/video1394.c | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c index 776b661..77f58bc 100644 --- a/drivers/ieee1394/video1394.c +++ b/drivers/ieee1394/video1394.c @@ -714,8 +714,8 @@ static inline unsigned video1394_buffer_state(struct dma_iso_ctx *d, return ret; } -static int __video1394_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) +static long video1394_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) { struct file_ctx *ctx = (struct file_ctx *)file->private_data; struct ti_ohci *ohci = ctx->ohci; @@ -1158,15 +1158,6 @@ static int __video1394_ioctl(struct file *file, } } -static long video1394_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - int err; - lock_kernel(); - err = __video1394_ioctl(file, cmd, arg); - unlock_kernel(); - return err; -} - /* * This maps the vmalloced and reserved buffer to user space. * @@ -1179,17 +1170,14 @@ static long video1394_ioctl(struct file *file, unsigned int cmd, unsigned long a static int video1394_mmap(struct file *file, struct vm_area_struct *vma) { struct file_ctx *ctx = (struct file_ctx *)file->private_data; - int res = -EINVAL; - lock_kernel(); if (ctx->current_ctx == NULL) { PRINT(KERN_ERR, ctx->ohci->host->id, "Current iso context not set"); - } else - res = dma_region_mmap(&ctx->current_ctx->dma, file, vma); - unlock_kernel(); + return -EINVAL; + } - return res; + return dma_region_mmap(&ctx->current_ctx->dma, file, vma); } static unsigned int video1394_poll(struct file *file, poll_table *pt) @@ -1200,14 +1188,12 @@ static unsigned int video1394_poll(struct file *file, poll_table *pt) struct dma_iso_ctx *d; int i; - lock_kernel(); ctx = file->private_data; d = ctx->current_ctx; if (d == NULL) { PRINT(KERN_ERR, ctx->ohci->host->id, "Current iso context not set"); - mask = POLLERR; - goto done; + return POLLERR; } poll_wait(file, &d->waitq, pt); @@ -1220,8 +1206,6 @@ static unsigned int video1394_poll(struct file *file, poll_table *pt) } } spin_unlock_irqrestore(&d->lock, flags); -done: - unlock_kernel(); return mask; } @@ -1257,7 +1241,6 @@ static int video1394_release(struct inode *inode, struct file *file) struct list_head *lh, *next; u64 mask; - lock_kernel(); list_for_each_safe(lh, next, &ctx->context_list) { struct dma_iso_ctx *d; d = list_entry(lh, struct dma_iso_ctx, link); @@ -1278,7 +1261,6 @@ static int video1394_release(struct inode *inode, struct file *file) kfree(ctx); file->private_data = NULL; - unlock_kernel(); return 0; } -- cgit v1.1 From 7b900c12cd689e4372afe3904a03f98253546449 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Fri, 20 Oct 2006 21:01:58 +0200 Subject: dv1394: remove BKL contention Purges the one remaining call to lock_kernel() from the 1394 subsystem. Signed-off-by: Stefan Richter --- drivers/ieee1394/dv1394.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c index 6c72f04..d0e11c1 100644 --- a/drivers/ieee1394/dv1394.c +++ b/drivers/ieee1394/dv1394.c @@ -1536,27 +1536,20 @@ static ssize_t dv1394_read(struct file *file, char __user *buffer, size_t count static long dv1394_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - struct video_card *video; + struct video_card *video = file_to_video_card(file); unsigned long flags; int ret = -EINVAL; void __user *argp = (void __user *)arg; DECLARE_WAITQUEUE(wait, current); - lock_kernel(); - video = file_to_video_card(file); - /* serialize this to prevent multi-threaded mayhem */ if (file->f_flags & O_NONBLOCK) { - if (!mutex_trylock(&video->mtx)) { - unlock_kernel(); + if (!mutex_trylock(&video->mtx)) return -EAGAIN; - } } else { - if (mutex_lock_interruptible(&video->mtx)) { - unlock_kernel(); + if (mutex_lock_interruptible(&video->mtx)) return -ERESTARTSYS; - } } switch(cmd) @@ -1780,7 +1773,6 @@ static long dv1394_ioctl(struct file *file, unsigned int cmd, unsigned long arg) out: mutex_unlock(&video->mtx); - unlock_kernel(); return ret; } -- cgit v1.1 From b7cffc57a777722941cfd904fcdbb47fc615b808 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 21 Oct 2006 01:22:36 +0200 Subject: ieee1394: nodemgr: small fix after sysfs errors patch One hunk in "ieee1394: handle sysfs errors" was wrong. Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index e95fe40..b79ff69 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -1233,7 +1233,7 @@ int hpsb_register_protocol(struct hpsb_protocol_driver *driver) if (!ret) nodemgr_create_drv_files(driver); - return 0; + return ret; } void hpsb_unregister_protocol(struct hpsb_protocol_driver *driver) -- cgit v1.1 From 7fdfc90945e308dc1be37e3914cd979a535263e9 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 21 Oct 2006 01:23:56 +0200 Subject: ieee1394: nodemgr: reflect which return values are errors Give better names to local variables. Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 64 ++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 34 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index b79ff69..bffa26e 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -67,7 +67,7 @@ static int nodemgr_check_speed(struct nodemgr_csr_info *ci, u64 addr, { quadlet_t q; u8 i, *speed, old_speed, good_speed; - int ret; + int error; speed = &(ci->host->speed[NODEID_TO_NODE(ci->nodeid)]); old_speed = *speed; @@ -79,9 +79,9 @@ static int nodemgr_check_speed(struct nodemgr_csr_info *ci, u64 addr, * just finished its initialization. */ for (i = IEEE1394_SPEED_100; i <= old_speed; i++) { *speed = i; - ret = hpsb_read(ci->host, ci->nodeid, ci->generation, addr, - &q, sizeof(quadlet_t)); - if (ret) + error = hpsb_read(ci->host, ci->nodeid, ci->generation, addr, + &q, sizeof(quadlet_t)); + if (error) break; *buffer = q; good_speed = i; @@ -95,19 +95,19 @@ static int nodemgr_check_speed(struct nodemgr_csr_info *ci, u64 addr, return 0; } *speed = old_speed; - return ret; + return error; } static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length, void *buffer, void *__ci) { struct nodemgr_csr_info *ci = (struct nodemgr_csr_info*)__ci; - int i, ret; + int i, error; for (i = 1; ; i++) { - ret = hpsb_read(ci->host, ci->nodeid, ci->generation, addr, - buffer, length); - if (!ret) { + error = hpsb_read(ci->host, ci->nodeid, ci->generation, addr, + buffer, length); + if (!error) { ci->speed_unverified = 0; break; } @@ -118,14 +118,14 @@ static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length, /* The ieee1394_core guessed the node's speed capability from * the self ID. Check whether a lower speed works. */ if (ci->speed_unverified && length == sizeof(quadlet_t)) { - ret = nodemgr_check_speed(ci, addr, buffer); - if (!ret) + error = nodemgr_check_speed(ci, addr, buffer); + if (!error) break; } if (msleep_interruptible(334)) return -EINTR; } - return ret; + return error; } static int nodemgr_get_max_rom(quadlet_t *bus_info_data, void *__ci) @@ -1226,14 +1226,11 @@ static int nodemgr_uevent(struct class_device *cdev, char **envp, int num_envp, int hpsb_register_protocol(struct hpsb_protocol_driver *driver) { - int ret; - /* This will cause a probe for devices */ - ret = driver_register(&driver->driver); - if (!ret) + int error = driver_register(&driver->driver); + if (!error) nodemgr_create_drv_files(driver); - - return ret; + return error; } void hpsb_unregister_protocol(struct hpsb_protocol_driver *driver) @@ -1468,7 +1465,7 @@ static void nodemgr_irm_write_bc(struct node_entry *ne, int generation) { const u64 bc_addr = (CSR_REGISTER_BASE | CSR_BROADCAST_CHANNEL); quadlet_t bc_remote, bc_local; - int ret; + int error; if (!ne->host->is_irm || ne->generation != generation || ne->nodeid == ne->host->node_id) @@ -1477,9 +1474,9 @@ static void nodemgr_irm_write_bc(struct node_entry *ne, int generation) bc_local = cpu_to_be32(ne->host->csr.broadcast_channel); /* Check if the register is implemented and 1394a compliant. */ - ret = hpsb_read(ne->host, ne->nodeid, generation, bc_addr, &bc_remote, - sizeof(bc_remote)); - if (!ret && bc_remote & cpu_to_be32(0x80000000) && + error = hpsb_read(ne->host, ne->nodeid, generation, bc_addr, &bc_remote, + sizeof(bc_remote)); + if (!error && bc_remote & cpu_to_be32(0x80000000) && bc_remote != bc_local) hpsb_node_write(ne, bc_addr, &bc_local, sizeof(bc_local)); } @@ -1569,7 +1566,7 @@ static void nodemgr_node_probe(struct host_info *hi, int generation) static int nodemgr_send_resume_packet(struct hpsb_host *host) { struct hpsb_packet *packet; - int ret = 1; + int error = -ENOMEM; packet = hpsb_make_phypacket(host, EXTPHYPACKET_TYPE_RESUME | @@ -1577,12 +1574,12 @@ static int nodemgr_send_resume_packet(struct hpsb_host *host) if (packet) { packet->no_waiter = 1; packet->generation = get_hpsb_generation(host); - ret = hpsb_send_packet(packet); + error = hpsb_send_packet(packet); } - if (ret) + if (error) HPSB_WARN("fw-host%d: Failed to broadcast resume packet", host->id); - return ret; + return error; } /* Perform a few high-level IRM responsibilities. */ @@ -1852,20 +1849,19 @@ static struct hpsb_highlevel nodemgr_highlevel = { int init_ieee1394_nodemgr(void) { - int ret; + int error; - ret = class_register(&nodemgr_ne_class); - if (ret < 0) - return ret; + error = class_register(&nodemgr_ne_class); + if (error) + return error; - ret = class_register(&nodemgr_ud_class); - if (ret < 0) { + error = class_register(&nodemgr_ud_class); + if (error) { class_unregister(&nodemgr_ne_class); - return ret; + return error; } hpsb_register_highlevel(&nodemgr_highlevel); - return 0; } -- cgit v1.1 From b07375b155a0d2ed21a64db68e737da1f19385f7 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 22 Oct 2006 16:16:27 +0200 Subject: ieee1394: nodemgr: revise semaphore protection of driver core data - The list "struct class.children" is supposed to be protected by class.sem, not by class.subsys.rwsem. - nodemgr_remove_uds() iterated over nodemgr_ud_class.children without proper protection. This was never observed as a bug since the code is usually only accessed by knodemgrd. All knodemgrds are currently globally serialized. But userspace can trigger this code too by writing to /sys/bus/ieee1394/destroy_node. - Clean up access to the FireWire bus type's subsys.rwsem: Access it uniformly via ieee1394_bus_type. Shrink rwsem protected regions where possible. Expand them where necessary. The latter wasn't a problem so far because knodemgr is globally serialized. This should harden the interaction of ieee1394 with sysfs and lay ground for deserialized operation of multiple knodemgrds and for implementation of subthreads for parallelized scanning and probing. Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 142 +++++++++++++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 50 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index bffa26e..e2ca8e9 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -374,11 +374,11 @@ static ssize_t fw_set_ignore_driver(struct device *dev, struct device_attribute int state = simple_strtoul(buf, NULL, 10); if (state == 1) { - down_write(&dev->bus->subsys.rwsem); - device_release_driver(dev); ud->ignore_driver = 1; - up_write(&dev->bus->subsys.rwsem); - } else if (!state) + down_write(&ieee1394_bus_type.subsys.rwsem); + device_release_driver(dev); + up_write(&ieee1394_bus_type.subsys.rwsem); + } else if (state == 0) ud->ignore_driver = 0; return count; @@ -436,7 +436,7 @@ static ssize_t fw_set_ignore_drivers(struct bus_type *bus, const char *buf, size if (state == 1) ignore_drivers = 1; - else if (!state) + else if (state == 0) ignore_drivers = 0; return count; @@ -734,20 +734,65 @@ static int nodemgr_bus_match(struct device * dev, struct device_driver * drv) } +static DEFINE_MUTEX(nodemgr_serialize_remove_uds); + static void nodemgr_remove_uds(struct node_entry *ne) { - struct class_device *cdev, *next; - struct unit_directory *ud; + struct class_device *cdev; + struct unit_directory *ud, **unreg; + size_t i, count; + + /* + * This is awkward: + * Iteration over nodemgr_ud_class.children has to be protected by + * nodemgr_ud_class.sem, but class_device_unregister() will eventually + * take nodemgr_ud_class.sem too. Therefore store all uds to be + * unregistered in a temporary array, release the semaphore, and then + * unregister the uds. + * + * Since nodemgr_remove_uds can also run in other contexts than the + * knodemgrds (which are currently globally serialized), protect the + * gap after release of the semaphore by nodemgr_serialize_remove_uds. + */ - list_for_each_entry_safe(cdev, next, &nodemgr_ud_class.children, node) { - ud = container_of(cdev, struct unit_directory, class_dev); + mutex_lock(&nodemgr_serialize_remove_uds); - if (ud->ne != ne) - continue; + down(&nodemgr_ud_class.sem); + count = 0; + list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { + ud = container_of(cdev, struct unit_directory, class_dev); + if (ud->ne == ne) + count++; + } + if (!count) { + up(&nodemgr_ud_class.sem); + mutex_unlock(&nodemgr_serialize_remove_uds); + return; + } + unreg = kcalloc(count, sizeof(*unreg), GFP_KERNEL); + if (!unreg) { + HPSB_ERR("NodeMgr: out of memory in nodemgr_remove_uds"); + up(&nodemgr_ud_class.sem); + mutex_unlock(&nodemgr_serialize_remove_uds); + return; + } + i = 0; + list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { + ud = container_of(cdev, struct unit_directory, class_dev); + if (ud->ne == ne) { + BUG_ON(i >= count); + unreg[i++] = ud; + } + } + up(&nodemgr_ud_class.sem); - class_device_unregister(&ud->class_dev); - device_unregister(&ud->device); + for (i = 0; i < count; i++) { + class_device_unregister(&unreg[i]->class_dev); + device_unregister(&unreg[i]->device); } + kfree(unreg); + + mutex_unlock(&nodemgr_serialize_remove_uds); } @@ -880,12 +925,11 @@ fail_alloc: static struct node_entry *find_entry_by_guid(u64 guid) { - struct class *class = &nodemgr_ne_class; struct class_device *cdev; struct node_entry *ne, *ret_ne = NULL; - down_read(&class->subsys.rwsem); - list_for_each_entry(cdev, &class->children, node) { + down(&nodemgr_ne_class.sem); + list_for_each_entry(cdev, &nodemgr_ne_class.children, node) { ne = container_of(cdev, struct node_entry, class_dev); if (ne->guid == guid) { @@ -893,20 +937,20 @@ static struct node_entry *find_entry_by_guid(u64 guid) break; } } - up_read(&class->subsys.rwsem); + up(&nodemgr_ne_class.sem); return ret_ne; } -static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host, nodeid_t nodeid) +static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host, + nodeid_t nodeid) { - struct class *class = &nodemgr_ne_class; struct class_device *cdev; struct node_entry *ne, *ret_ne = NULL; - down_read(&class->subsys.rwsem); - list_for_each_entry(cdev, &class->children, node) { + down(&nodemgr_ne_class.sem); + list_for_each_entry(cdev, &nodemgr_ne_class.children, node) { ne = container_of(cdev, struct node_entry, class_dev); if (ne->host == host && ne->nodeid == nodeid) { @@ -914,7 +958,7 @@ static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host, nodeid_t break; } } - up_read(&class->subsys.rwsem); + up(&nodemgr_ne_class.sem); return ret_ne; } @@ -1377,7 +1421,6 @@ static void nodemgr_node_scan(struct host_info *hi, int generation) } -/* Caller needs to hold nodemgr_ud_class.subsys.rwsem as reader. */ static void nodemgr_suspend_ne(struct node_entry *ne) { struct class_device *cdev; @@ -1389,19 +1432,20 @@ static void nodemgr_suspend_ne(struct node_entry *ne) ne->in_limbo = 1; WARN_ON(device_create_file(&ne->device, &dev_attr_ne_in_limbo)); - down_write(&ne->device.bus->subsys.rwsem); + down(&nodemgr_ud_class.sem); list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { ud = container_of(cdev, struct unit_directory, class_dev); - if (ud->ne != ne) continue; + down_write(&ieee1394_bus_type.subsys.rwsem); if (ud->device.driver && (!ud->device.driver->suspend || ud->device.driver->suspend(&ud->device, PMSG_SUSPEND))) device_release_driver(&ud->device); + up_write(&ieee1394_bus_type.subsys.rwsem); } - up_write(&ne->device.bus->subsys.rwsem); + up(&nodemgr_ud_class.sem); } @@ -1413,45 +1457,47 @@ static void nodemgr_resume_ne(struct node_entry *ne) ne->in_limbo = 0; device_remove_file(&ne->device, &dev_attr_ne_in_limbo); - down_read(&nodemgr_ud_class.subsys.rwsem); - down_read(&ne->device.bus->subsys.rwsem); + down(&nodemgr_ud_class.sem); list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { ud = container_of(cdev, struct unit_directory, class_dev); - if (ud->ne != ne) continue; + down_read(&ieee1394_bus_type.subsys.rwsem); if (ud->device.driver && ud->device.driver->resume) ud->device.driver->resume(&ud->device); + up_read(&ieee1394_bus_type.subsys.rwsem); } - up_read(&ne->device.bus->subsys.rwsem); - up_read(&nodemgr_ud_class.subsys.rwsem); + up(&nodemgr_ud_class.sem); HPSB_DEBUG("Node resumed: ID:BUS[" NODE_BUS_FMT "] GUID[%016Lx]", NODE_BUS_ARGS(ne->host, ne->nodeid), (unsigned long long)ne->guid); } -/* Caller needs to hold nodemgr_ud_class.subsys.rwsem as reader. */ static void nodemgr_update_pdrv(struct node_entry *ne) { struct unit_directory *ud; struct hpsb_protocol_driver *pdrv; struct class_device *cdev; + down(&nodemgr_ud_class.sem); list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { ud = container_of(cdev, struct unit_directory, class_dev); - if (ud->ne != ne || !ud->device.driver) + if (ud->ne != ne) continue; - pdrv = container_of(ud->device.driver, struct hpsb_protocol_driver, driver); - - if (pdrv->update && pdrv->update(ud)) { - down_write(&ud->device.bus->subsys.rwsem); - device_release_driver(&ud->device); - up_write(&ud->device.bus->subsys.rwsem); + down_write(&ieee1394_bus_type.subsys.rwsem); + if (ud->device.driver) { + pdrv = container_of(ud->device.driver, + struct hpsb_protocol_driver, + driver); + if (pdrv->update && pdrv->update(ud)) + device_release_driver(&ud->device); } + up_write(&ieee1394_bus_type.subsys.rwsem); } + up(&nodemgr_ud_class.sem); } @@ -1482,8 +1528,6 @@ static void nodemgr_irm_write_bc(struct node_entry *ne, int generation) } -/* Caller needs to hold nodemgr_ud_class.subsys.rwsem as reader because the - * calls to nodemgr_update_pdrv() and nodemgr_suspend_ne() here require it. */ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int generation) { struct device *dev; @@ -1516,7 +1560,6 @@ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int ge static void nodemgr_node_probe(struct host_info *hi, int generation) { struct hpsb_host *host = hi->host; - struct class *class = &nodemgr_ne_class; struct class_device *cdev; struct node_entry *ne; @@ -1529,18 +1572,18 @@ static void nodemgr_node_probe(struct host_info *hi, int generation) * while probes are time-consuming. (Well, those probes need some * improvement...) */ - down_read(&class->subsys.rwsem); - list_for_each_entry(cdev, &class->children, node) { + down(&nodemgr_ne_class.sem); + list_for_each_entry(cdev, &nodemgr_ne_class.children, node) { ne = container_of(cdev, struct node_entry, class_dev); if (!ne->needs_probe) nodemgr_probe_ne(hi, ne, generation); } - list_for_each_entry(cdev, &class->children, node) { + list_for_each_entry(cdev, &nodemgr_ne_class.children, node) { ne = container_of(cdev, struct node_entry, class_dev); if (ne->needs_probe) nodemgr_probe_ne(hi, ne, generation); } - up_read(&class->subsys.rwsem); + up(&nodemgr_ne_class.sem); /* If we had a bus reset while we were scanning the bus, it is @@ -1752,19 +1795,18 @@ exit: int nodemgr_for_each_host(void *__data, int (*cb)(struct hpsb_host *, void *)) { - struct class *class = &hpsb_host_class; struct class_device *cdev; struct hpsb_host *host; int error = 0; - down_read(&class->subsys.rwsem); - list_for_each_entry(cdev, &class->children, node) { + down(&hpsb_host_class.sem); + list_for_each_entry(cdev, &hpsb_host_class.children, node) { host = container_of(cdev, struct hpsb_host, class_dev); if ((error = cb(host, __data))) break; } - up_read(&class->subsys.rwsem); + up(&hpsb_host_class.sem); return error; } -- cgit v1.1 From 7f5880394c8ab01854c0cba288352a1a77d5ea82 Mon Sep 17 00:00:00 2001 From: Randy Dunlap Date: Mon, 23 Oct 2006 21:44:36 -0700 Subject: ieee1394: fix printk format warning Fix printk format warning: drivers/ieee1394/nodemgr.c:364: warning: long long unsigned int format, u64 arg (arg 3) Signed-off-by: Randy Dunlap Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index e2ca8e9..640d677 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -362,7 +362,7 @@ static ssize_t fw_show_ne_tlabels_mask(struct device *dev, #endif spin_unlock_irqrestore(&hpsb_tlabel_lock, flags); - return sprintf(buf, "0x%016llx\n", tm); + return sprintf(buf, "0x%016llx\n", (unsigned long long)tm); } static DEVICE_ATTR(tlabels_mask, S_IRUGO, fw_show_ne_tlabels_mask, NULL); #endif /* HPSB_DEBUG_TLABELS */ -- cgit v1.1 From def4d8733b8b8fed521957a7fd546714dd491b91 Mon Sep 17 00:00:00 2001 From: Randy Dunlap Date: Tue, 24 Oct 2006 11:19:11 -0700 Subject: ieee1394: only build OUI database files if config enabled Only build IEEE1394 OUI database files if the config option is enabled. Signed-off-by: Randy Dunlap Signed-off-by: Stefan Richter --- drivers/ieee1394/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/Makefile b/drivers/ieee1394/Makefile index 6f53611..d9650d3 100644 --- a/drivers/ieee1394/Makefile +++ b/drivers/ieee1394/Makefile @@ -3,8 +3,11 @@ # ieee1394-objs := ieee1394_core.o ieee1394_transactions.o hosts.o \ - highlevel.o csr.o nodemgr.o oui.o dma.o iso.o \ + highlevel.o csr.o nodemgr.o dma.o iso.o \ csr1212.o config_roms.o +ifdef CONFIG_IEEE1394_OUI_DB +ieee1394-objs += oui.o +endif obj-$(CONFIG_IEEE1394) += ieee1394.o obj-$(CONFIG_IEEE1394_PCILYNX) += pcilynx.o -- cgit v1.1 From 2a3f8ad3a94c784f57958bd692428cb342ce4114 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 29 Oct 2006 19:52:49 +0100 Subject: ieee1394: ohci1394: revert fail on error in suspend Some errors during preparation for suspended state can be skipped with a warning instead of a failure of the whole suspend transition, notably an error in pci_set_power_state. Signed-off-by: Stefan Richter --- drivers/ieee1394/ohci1394.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index a128025..44adefd 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c @@ -3534,6 +3534,9 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) int err; struct ti_ohci *ohci = pci_get_drvdata(pdev); + printk(KERN_INFO "%s does not fully support suspend and resume yet\n", + OHCI1394_DRIVER_NAME); + PRINT(KERN_DEBUG, "suspend called"); if (!ohci) return -ENXIO; @@ -3558,11 +3561,17 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) ohci_soft_reset(ohci); err = pci_save_state(pdev); - if (err) + if (err) { + printk(KERN_ERR "%s: pci_save_state failed with %d\n", + OHCI1394_DRIVER_NAME, err); return err; + } err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); +#ifdef OHCI1394_DEBUG if (err) - return err; + printk(KERN_DEBUG "%s: pci_set_power_state failed with %d\n", + OHCI1394_DRIVER_NAME, err); +#endif /* OHCI1394_DEBUG */ /* PowerMac suspend code comes last */ #ifdef CONFIG_PPC_PMAC -- cgit v1.1 From 5f8d17f6023ea9aca7c0063c5b472529f2664944 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 29 Oct 2006 19:58:25 +0100 Subject: ieee1394: ohci1394: proper log messages in suspend and resume - correct thinko in one of my last commits: cannot use PRINT macro with ohci == NULL - add log messages on ohci == NULL and on pci_enable_device != 0 - update log macros from patch "revert fail on error in suspend" to use PRINT and DBGMSG where possible Signed-off-by: Stefan Richter --- drivers/ieee1394/ohci1394.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index 44adefd..406b750 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c @@ -3537,9 +3537,12 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) printk(KERN_INFO "%s does not fully support suspend and resume yet\n", OHCI1394_DRIVER_NAME); - PRINT(KERN_DEBUG, "suspend called"); - if (!ohci) + if (!ohci) { + printk(KERN_ERR "%s: tried to suspend nonexisting host\n", + OHCI1394_DRIVER_NAME); return -ENXIO; + } + DBGMSG("suspend called"); /* Clear the async DMA contexts and stop using the controller */ hpsb_bus_reset(ohci->host); @@ -3562,16 +3565,12 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) err = pci_save_state(pdev); if (err) { - printk(KERN_ERR "%s: pci_save_state failed with %d\n", - OHCI1394_DRIVER_NAME, err); + PRINT(KERN_ERR, "pci_save_state failed with %d", err); return err; } err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); -#ifdef OHCI1394_DEBUG if (err) - printk(KERN_DEBUG "%s: pci_set_power_state failed with %d\n", - OHCI1394_DRIVER_NAME, err); -#endif /* OHCI1394_DEBUG */ + DBGMSG("pci_set_power_state failed with %d", err); /* PowerMac suspend code comes last */ #ifdef CONFIG_PPC_PMAC @@ -3593,9 +3592,12 @@ static int ohci1394_pci_resume(struct pci_dev *pdev) int err; struct ti_ohci *ohci = pci_get_drvdata(pdev); - PRINT(KERN_DEBUG, "resume called"); - if (!ohci) + if (!ohci) { + printk(KERN_ERR "%s: tried to resume nonexisting host\n", + OHCI1394_DRIVER_NAME); return -ENXIO; + } + DBGMSG("resume called"); /* PowerMac resume code comes first */ #ifdef CONFIG_PPC_PMAC @@ -3612,8 +3614,10 @@ static int ohci1394_pci_resume(struct pci_dev *pdev) pci_set_power_state(pdev, PCI_D0); pci_restore_state(pdev); err = pci_enable_device(pdev); - if (err) + if (err) { + PRINT(KERN_ERR, "pci_enable_device failed with %d", err); return err; + } /* See ohci1394_pci_probe() for comments on this sequence */ ohci_soft_reset(ohci); -- cgit v1.1 From bfe89d724527c8b1bb1b68b0da1d94907b094094 Mon Sep 17 00:00:00 2001 From: Eric Sesterhenn Date: Sun, 29 Oct 2006 23:13:40 +0300 Subject: drivers/ieee1394/*: use kmemdup() Signed-off-by: Eric Sesterhenn Signed-off-by: Alexey Dobriyan Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 3 +-- drivers/ieee1394/pcilynx.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 640d677..801f6061 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -1078,10 +1078,9 @@ static struct unit_directory *nodemgr_process_unit_directory /* Logical Unit Number */ if (kv->key.type == CSR1212_KV_TYPE_IMMEDIATE) { if (ud->flags & UNIT_DIRECTORY_HAS_LUN) { - ud_child = kmalloc(sizeof(*ud_child), GFP_KERNEL); + ud_child = kmemdup(ud, sizeof(*ud_child), GFP_KERNEL); if (!ud_child) goto unit_directory_error; - memcpy(ud_child, ud, sizeof(*ud_child)); nodemgr_register_device(ne, ud_child, &ne->device); ud_child = NULL; diff --git a/drivers/ieee1394/pcilynx.c b/drivers/ieee1394/pcilynx.c index 9cab1d6..13a6179 100644 --- a/drivers/ieee1394/pcilynx.c +++ b/drivers/ieee1394/pcilynx.c @@ -1428,10 +1428,9 @@ static int __devinit add_card(struct pci_dev *dev, struct i2c_algo_bit_data i2c_adapter_data; error = -ENOMEM; - i2c_ad = kmalloc(sizeof(*i2c_ad), GFP_KERNEL); + i2c_ad = kmemdup(&bit_ops, sizeof(*i2c_ad), GFP_KERNEL); if (!i2c_ad) FAIL("failed to allocate I2C adapter memory"); - memcpy(i2c_ad, &bit_ops, sizeof(struct i2c_adapter)); i2c_adapter_data = bit_data; i2c_ad->algo_data = &i2c_adapter_data; i2c_adapter_data.data = lynx; -- cgit v1.1 From 1f72cf5251a8f806a8930ae2cd152aa79fd0de83 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 29 Oct 2006 23:09:11 +0100 Subject: ieee1394: nodemgr: take it easy if bus_rescan_devices fails This happens. No need to log a BUG trace. Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 801f6061..89a4bd4 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -1600,9 +1600,8 @@ static void nodemgr_node_probe(struct host_info *hi, int generation) * just removed. */ if (generation == get_hpsb_generation(host)) - WARN_ON(bus_rescan_devices(&ieee1394_bus_type)); - - return; + if (bus_rescan_devices(&ieee1394_bus_type)) + HPSB_DEBUG("bus_rescan_devices had an error"); } static int nodemgr_send_resume_packet(struct hpsb_host *host) -- cgit v1.1 From c0f00e279712923cc945604d29a252e52c7838e1 Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Mon, 30 Oct 2006 15:51:52 +0300 Subject: ohci1394: shortcut irq printing To print irq number no need to transform to string using %d, then print using %s. Just use %d. Signed-off-by: Alexey Dobriyan --- drivers/ieee1394/ohci1394.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index 406b750..b8e922b 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c @@ -468,7 +468,6 @@ static int get_nb_iso_ctx(struct ti_ohci *ohci, int reg) /* Global initialization */ static void ohci_initialize(struct ti_ohci *ohci) { - char irq_buf[16]; quadlet_t buf; int num_ports, i; @@ -586,11 +585,10 @@ static void ohci_initialize(struct ti_ohci *ohci) reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_linkEnable); buf = reg_read(ohci, OHCI1394_Version); - sprintf (irq_buf, "%d", ohci->dev->irq); - PRINT(KERN_INFO, "OHCI-1394 %d.%d (PCI): IRQ=[%s] " + PRINT(KERN_INFO, "OHCI-1394 %d.%d (PCI): IRQ=[%d] " "MMIO=[%llx-%llx] Max Packet=[%d] IR/IT contexts=[%d/%d]", ((((buf) >> 16) & 0xf) + (((buf) >> 20) & 0xf) * 10), - ((((buf) >> 4) & 0xf) + ((buf) & 0xf) * 10), irq_buf, + ((((buf) >> 4) & 0xf) + ((buf) & 0xf) * 10), ohci->dev->irq, (unsigned long long)pci_resource_start(ohci->dev, 0), (unsigned long long)pci_resource_start(ohci->dev, 0) + OHCI1394_REGISTER_SIZE - 1, ohci->max_packet_size, -- cgit v1.1 From 66743e061f6f31ac81fb8a1e9edb2ff92ef24df2 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: remove irritating log message The queue depth can be read from /sys/bus/scsi/devices/*/queue_depth, so don't log it. And the hint about speed improvements is misleading, at least under current kernels. If serialization is switched off, read performance is typically increased by less than 10%. (I did not test write performance recently.) On the other hand, serialize_io=0 is not yet safe due to some implementation issues that are not trivial to fix. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index e5ba55b..becd98d 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -2670,8 +2670,6 @@ static int sbp2_module_init(void) /* Module load debug option to force one command at a time (serializing I/O) */ if (serialize_io) { - SBP2_INFO("Driver forced to serialize I/O (serialize_io=1)"); - SBP2_INFO("Try serialize_io=0 for better performance"); scsi_driver_template.can_queue = 1; scsi_driver_template.cmd_per_lun = 1; } -- cgit v1.1 From ea42ea0f58aaa03e9cd245b124903e25629746e6 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: clean up function declarations Remove unnecessary function prototypes. Remove variable names from function prototypes. Move declarations from sbp2.h to sbp2.c. Move definitions of driver templates together near the top of sbp2.c. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 145 ++++++++++++++++++++++++++++-------------------- drivers/ieee1394/sbp2.h | 45 --------------- 2 files changed, 86 insertions(+), 104 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index becd98d..f1f5de6 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -180,19 +180,6 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" ", or a combination)"); /* - * Export information about protocols/devices supported by this driver. - */ -static struct ieee1394_device_id sbp2_id_table[] = { - { - .match_flags = IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION, - .specifier_id = SBP2_UNIT_SPEC_ID_ENTRY & 0xffffff, - .version = SBP2_SW_VERSION_ENTRY & 0xffffff}, - {} -}; - -MODULE_DEVICE_TABLE(ieee1394, sbp2_id_table); - -/* * Debug levels, configured via kernel config, or enable here. */ @@ -250,40 +237,66 @@ static u32 global_outstanding_dmas = 0; /* * Globals */ +static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *, u32); +static void sbp2scsi_complete_command(struct scsi_id_instance_data *, u32, + struct scsi_cmnd *, + void (*)(struct scsi_cmnd *)); +static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *); +static int sbp2_start_device(struct scsi_id_instance_data *); +static void sbp2_remove_device(struct scsi_id_instance_data *); +static int sbp2_login_device(struct scsi_id_instance_data *); +static int sbp2_reconnect_device(struct scsi_id_instance_data *); +static int sbp2_logout_device(struct scsi_id_instance_data *); +static void sbp2_host_reset(struct hpsb_host *); +static int sbp2_handle_status_write(struct hpsb_host *, int, int, quadlet_t *, + u64, size_t, u16); +static int sbp2_agent_reset(struct scsi_id_instance_data *, int); +static void sbp2_parse_unit_directory(struct scsi_id_instance_data *, + struct unit_directory *); +static int sbp2_set_busy_timeout(struct scsi_id_instance_data *); +static int sbp2_max_speed_and_size(struct scsi_id_instance_data *); -static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id, - u32 status); - -static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, - u32 scsi_status, struct scsi_cmnd *SCpnt, - void (*done)(struct scsi_cmnd *)); - -static struct scsi_host_template scsi_driver_template; static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC }; -static void sbp2_host_reset(struct hpsb_host *host); - -static int sbp2_probe(struct device *dev); -static int sbp2_remove(struct device *dev); -static int sbp2_update(struct unit_directory *ud); - static struct hpsb_highlevel sbp2_highlevel = { - .name = SBP2_DEVICE_NAME, - .host_reset = sbp2_host_reset, + .name = SBP2_DEVICE_NAME, + .host_reset = sbp2_host_reset, }; static struct hpsb_address_ops sbp2_ops = { - .write = sbp2_handle_status_write + .write = sbp2_handle_status_write }; #ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA +static int sbp2_handle_physdma_write(struct hpsb_host *, int, int, quadlet_t *, + u64, size_t, u16); +static int sbp2_handle_physdma_read(struct hpsb_host *, int, quadlet_t *, u64, + size_t, u16); + static struct hpsb_address_ops sbp2_physdma_ops = { - .read = sbp2_handle_physdma_read, - .write = sbp2_handle_physdma_write, + .read = sbp2_handle_physdma_read, + .write = sbp2_handle_physdma_write, }; #endif + +/* + * Interface to driver core and IEEE 1394 core + */ +static struct ieee1394_device_id sbp2_id_table[] = { + { + .match_flags = IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION, + .specifier_id = SBP2_UNIT_SPEC_ID_ENTRY & 0xffffff, + .version = SBP2_SW_VERSION_ENTRY & 0xffffff}, + {} +}; +MODULE_DEVICE_TABLE(ieee1394, sbp2_id_table); + +static int sbp2_probe(struct device *); +static int sbp2_remove(struct device *); +static int sbp2_update(struct unit_directory *); + static struct hpsb_protocol_driver sbp2_driver = { .name = "SBP2 Driver", .id_table = sbp2_id_table, @@ -296,6 +309,47 @@ static struct hpsb_protocol_driver sbp2_driver = { }, }; + +/* + * Interface to SCSI core + */ +static int sbp2scsi_queuecommand(struct scsi_cmnd *, + void (*)(struct scsi_cmnd *)); +static int sbp2scsi_abort(struct scsi_cmnd *); +static int sbp2scsi_reset(struct scsi_cmnd *); +static int sbp2scsi_slave_alloc(struct scsi_device *); +static int sbp2scsi_slave_configure(struct scsi_device *); +static void sbp2scsi_slave_destroy(struct scsi_device *); +static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *, + struct device_attribute *, char *); + +static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL); + +static struct device_attribute *sbp2_sysfs_sdev_attrs[] = { + &dev_attr_ieee1394_id, + NULL +}; + +static struct scsi_host_template scsi_driver_template = { + .module = THIS_MODULE, + .name = "SBP-2 IEEE-1394", + .proc_name = SBP2_DEVICE_NAME, + .queuecommand = sbp2scsi_queuecommand, + .eh_abort_handler = sbp2scsi_abort, + .eh_device_reset_handler = sbp2scsi_reset, + .slave_alloc = sbp2scsi_slave_alloc, + .slave_configure = sbp2scsi_slave_configure, + .slave_destroy = sbp2scsi_slave_destroy, + .this_id = -1, + .sg_tablesize = SG_ALL, + .use_clustering = ENABLE_CLUSTERING, + .cmd_per_lun = SBP2_MAX_CMDS, + .can_queue = SBP2_MAX_CMDS, + .emulated = 1, + .sdev_attrs = sbp2_sysfs_sdev_attrs, +}; + + /* * List of devices with known bugs. * @@ -715,7 +769,6 @@ static inline int sbp2util_node_is_available(struct scsi_id_instance_data *scsi_ /********************************************* * IEEE-1394 core driver stack related section *********************************************/ -static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud); static int sbp2_probe(struct device *dev) { @@ -2630,38 +2683,12 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)scsi_id->ne->guid, scsi_id->ud->id, lun); } -static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL); - -static struct device_attribute *sbp2_sysfs_sdev_attrs[] = { - &dev_attr_ieee1394_id, - NULL -}; MODULE_AUTHOR("Ben Collins "); MODULE_DESCRIPTION("IEEE-1394 SBP-2 protocol driver"); MODULE_SUPPORTED_DEVICE(SBP2_DEVICE_NAME); MODULE_LICENSE("GPL"); -/* SCSI host template */ -static struct scsi_host_template scsi_driver_template = { - .module = THIS_MODULE, - .name = "SBP-2 IEEE-1394", - .proc_name = SBP2_DEVICE_NAME, - .queuecommand = sbp2scsi_queuecommand, - .eh_abort_handler = sbp2scsi_abort, - .eh_device_reset_handler = sbp2scsi_reset, - .slave_alloc = sbp2scsi_slave_alloc, - .slave_configure = sbp2scsi_slave_configure, - .slave_destroy = sbp2scsi_slave_destroy, - .this_id = -1, - .sg_tablesize = SG_ALL, - .use_clustering = ENABLE_CLUSTERING, - .cmd_per_lun = SBP2_MAX_CMDS, - .can_queue = SBP2_MAX_CMDS, - .emulated = 1, - .sdev_attrs = sbp2_sysfs_sdev_attrs, -}; - static int sbp2_module_init(void) { int ret; diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index 1b16d6b..56917b9 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -364,49 +364,4 @@ struct sbp2scsi_host_info { struct list_head scsi_ids; /* List of scsi ids on this host */ }; -/* - * Function prototypes - */ - -/* - * Various utility prototypes - */ -static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id); -static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id); -static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb); -static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt); -static struct sbp2_command_info *sbp2util_allocate_command_orb(struct scsi_id_instance_data *scsi_id, - struct scsi_cmnd *Current_SCpnt, - void (*Current_done)(struct scsi_cmnd *)); -static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id, - struct sbp2_command_info *command); - - -static int sbp2_start_device(struct scsi_id_instance_data *scsi_id); -static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id); - -#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA -static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data, - u64 addr, size_t length, u16 flags); -static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, quadlet_t *data, - u64 addr, size_t length, u16 flags); -#endif - -/* - * SBP-2 protocol related prototypes - */ -static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id); -static int sbp2_login_device(struct scsi_id_instance_data *scsi_id); -static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id); -static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id); -static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid, - quadlet_t *data, u64 addr, size_t length, u16 flags); -static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait); -static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, - unchar *sense_data); -static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, - struct unit_directory *ud); -static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id); -static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id); - #endif /* SBP2_H */ -- cgit v1.1 From 8c8009e69b31c60e875a348c1b032ed9543d1df6 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: remove dead code This has been within #if 0 for a long time and is wrong anyway. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index f1f5de6..2b30994 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -2546,21 +2546,6 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, } /* - * If a unit attention occurs, return busy status so it gets - * retried... it could have happened because of a 1394 bus reset - * or hot-plug... - * XXX DID_BUS_BUSY is actually a bad idea because it will defy - * the scsi layer's retry logic. - */ -#if 0 - if ((scsi_status == SBP2_SCSI_STATUS_CHECK_CONDITION) && - (SCpnt->sense_buffer[2] == UNIT_ATTENTION)) { - SBP2_DEBUG("UNIT ATTENTION - return busy"); - SCpnt->result = DID_BUS_BUSY << 16; - } -#endif - - /* * Tell scsi stack that we're done with this command */ done(SCpnt); -- cgit v1.1 From 0b885449ac6fab42cd6808c9ea8d6e456e0e65b7 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: remove duplicate code The same case is handled further below in sbp2scsi_complete_command. Note, the second version behaves slightly different but looks preferable. It's an extremely unlikely case by the way. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 2b30994..38abf03 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -2484,17 +2484,6 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, } /* - * If a bus reset is in progress and there was an error, don't - * complete the command, just let it get retried at the end of the - * bus reset. - */ - if (!hpsb_node_entry_valid(scsi_id->ne) - && (scsi_status != SBP2_SCSI_STATUS_GOOD)) { - SBP2_ERR("Bus reset in progress - retry command later"); - return; - } - - /* * Switch on scsi status */ switch (scsi_status) { -- cgit v1.1 From 35644090d82557d4ae5b4c75e29396406cc9d58a Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: consolidate log levels Replace some calls to SBP2_ERR and SBP2_WARN by SBP2_INFO. Remove logging macros SBP2_NOTICE and SBP2_WARN. Remove direct usage of HPSB_ logging macros. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 38abf03..ecbb5ee 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -217,18 +217,12 @@ static u32 global_outstanding_dmas = 0; #if CONFIG_IEEE1394_SBP2_DEBUG >= 2 #define SBP2_DEBUG(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) #define SBP2_INFO(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) -#define SBP2_NOTICE(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) -#define SBP2_WARN(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) #elif CONFIG_IEEE1394_SBP2_DEBUG == 1 #define SBP2_DEBUG(fmt, args...) HPSB_DEBUG("sbp2: "fmt, ## args) #define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) -#define SBP2_NOTICE(fmt, args...) HPSB_NOTICE("sbp2: "fmt, ## args) -#define SBP2_WARN(fmt, args...) HPSB_WARN("sbp2: "fmt, ## args) #else #define SBP2_DEBUG(fmt, args...) do {} while (0) #define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) -#define SBP2_NOTICE(fmt, args...) HPSB_NOTICE("sbp2: "fmt, ## args) -#define SBP2_WARN(fmt, args...) HPSB_WARN("sbp2: "fmt, ## args) #endif #define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) @@ -1559,7 +1553,7 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) return -EIO; } - HPSB_DEBUG("Reconnected to SBP-2 device"); + SBP2_INFO("Reconnected to SBP-2 device"); return 0; } @@ -1685,7 +1679,7 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, * max_sectors on the fly, therefore warn only. */ if (workarounds & SBP2_WORKAROUND_128K_MAX_TRANS && (max_sectors * 512) > (128 * 1024)) - SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB " + SBP2_INFO("Node " NODE_BUS_FMT ": Bridge only supports 128KB " "max transfer size. WARNING: Current max_sectors " "setting is larger than 128KB (%d sectors)", NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid), @@ -1733,8 +1727,7 @@ static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id) /* Bump down our speed if the user requested it */ if (scsi_id->speed_code > max_speed) { scsi_id->speed_code = max_speed; - SBP2_ERR("Forcing SBP-2 max speed down to %s", - hpsb_speedto_str[scsi_id->speed_code]); + SBP2_INFO("Reducing speed to %s", hpsb_speedto_str[max_speed]); } /* Payload size is the lesser of what our speed supports and what @@ -1749,10 +1742,10 @@ static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id) payload) payload--; - HPSB_DEBUG("Node " NODE_BUS_FMT ": Max speed [%s] - Max payload [%u]", - NODE_BUS_ARGS(hi->host, scsi_id->ne->nodeid), - hpsb_speedto_str[scsi_id->speed_code], - SBP2_PAYLOAD_TO_BYTES(payload)); + SBP2_INFO("Node " NODE_BUS_FMT ": Max speed [%s] - Max payload [%u]", + NODE_BUS_ARGS(hi->host, scsi_id->ne->nodeid), + hpsb_speedto_str[scsi_id->speed_code], + SBP2_PAYLOAD_TO_BYTES(payload)); scsi_id->max_payload_size = payload; return 0; @@ -1997,7 +1990,7 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, else if (dma_dir == DMA_FROM_DEVICE && scsi_request_bufflen) orb_direction = ORB_DIRECTION_READ_FROM_MEDIA; else { - SBP2_WARN("Falling back to DMA_NONE"); + SBP2_INFO("Falling back to DMA_NONE"); orb_direction = ORB_DIRECTION_NO_DATA_TRANSFER; } @@ -2280,7 +2273,7 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, u32 r = STATUS_GET_RESP(h); if (r != RESP_STATUS_REQUEST_COMPLETE) { - SBP2_WARN("resp 0x%x, sbp_status 0x%x", + SBP2_INFO("resp 0x%x, sbp_status 0x%x", r, STATUS_GET_SBP_STATUS(h)); scsi_status = r == RESP_STATUS_TRANSPORT_FAILURE ? @@ -2587,7 +2580,7 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) struct sbp2_command_info *command; unsigned long flags; - SBP2_ERR("aborting sbp2 command"); + SBP2_INFO("aborting sbp2 command"); scsi_print_command(SCpnt); if (sbp2util_node_is_available(scsi_id)) { @@ -2628,10 +2621,10 @@ static int sbp2scsi_reset(struct scsi_cmnd *SCpnt) struct scsi_id_instance_data *scsi_id = (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0]; - SBP2_ERR("reset requested"); + SBP2_INFO("reset requested"); if (sbp2util_node_is_available(scsi_id)) { - SBP2_ERR("Generating sbp2 fetch agent reset"); + SBP2_INFO("generating sbp2 fetch agent reset"); sbp2_agent_reset(scsi_id, 1); } -- cgit v1.1 From edf1fb213e5df03983b91bb050bdd2914465a843 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: remove debug macros No need to keep them in released sources. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 300 ++++-------------------------------------------- 1 file changed, 20 insertions(+), 280 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index ecbb5ee..6bd26a9 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -179,54 +179,9 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) ", or a combination)"); -/* - * Debug levels, configured via kernel config, or enable here. - */ - -#define CONFIG_IEEE1394_SBP2_DEBUG 0 -/* #define CONFIG_IEEE1394_SBP2_DEBUG_ORBS */ -/* #define CONFIG_IEEE1394_SBP2_DEBUG_DMA */ -/* #define CONFIG_IEEE1394_SBP2_DEBUG 1 */ -/* #define CONFIG_IEEE1394_SBP2_DEBUG 2 */ -/* #define CONFIG_IEEE1394_SBP2_PACKET_DUMP */ - -#ifdef CONFIG_IEEE1394_SBP2_DEBUG_ORBS -#define SBP2_ORB_DEBUG(fmt, args...) HPSB_ERR("sbp2(%s): "fmt, __FUNCTION__, ## args) -static u32 global_outstanding_command_orbs = 0; -#define outstanding_orb_incr global_outstanding_command_orbs++ -#define outstanding_orb_decr global_outstanding_command_orbs-- -#else -#define SBP2_ORB_DEBUG(fmt, args...) do {} while (0) -#define outstanding_orb_incr do {} while (0) -#define outstanding_orb_decr do {} while (0) -#endif - -#ifdef CONFIG_IEEE1394_SBP2_DEBUG_DMA -#define SBP2_DMA_ALLOC(fmt, args...) \ - HPSB_ERR("sbp2(%s)alloc(%d): "fmt, __FUNCTION__, \ - ++global_outstanding_dmas, ## args) -#define SBP2_DMA_FREE(fmt, args...) \ - HPSB_ERR("sbp2(%s)free(%d): "fmt, __FUNCTION__, \ - --global_outstanding_dmas, ## args) -static u32 global_outstanding_dmas = 0; -#else -#define SBP2_DMA_ALLOC(fmt, args...) do {} while (0) -#define SBP2_DMA_FREE(fmt, args...) do {} while (0) -#endif -#if CONFIG_IEEE1394_SBP2_DEBUG >= 2 -#define SBP2_DEBUG(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) -#define SBP2_INFO(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) -#elif CONFIG_IEEE1394_SBP2_DEBUG == 1 -#define SBP2_DEBUG(fmt, args...) HPSB_DEBUG("sbp2: "fmt, ## args) -#define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) -#else -#define SBP2_DEBUG(fmt, args...) do {} while (0) -#define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) -#endif - -#define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) -#define SBP2_DEBUG_ENTER() SBP2_DEBUG("%s", __FUNCTION__) +#define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) +#define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) /* * Globals @@ -433,42 +388,6 @@ static inline void sbp2util_cpu_to_be32_buffer(void *buffer, int length) #define sbp2util_cpu_to_be32_buffer(x,y) do {} while (0) #endif -#ifdef CONFIG_IEEE1394_SBP2_PACKET_DUMP -/* - * Debug packet dump routine. Length is in bytes. - */ -static void sbp2util_packet_dump(void *buffer, int length, char *dump_name, - u32 dump_phys_addr) -{ - int i; - unsigned char *dump = buffer; - - if (!dump || !length || !dump_name) - return; - - if (dump_phys_addr) - printk("[%s, 0x%x]", dump_name, dump_phys_addr); - else - printk("[%s]", dump_name); - for (i = 0; i < length; i++) { - if (i > 0x3f) { - printk("\n ..."); - break; - } - if ((i & 0x3) == 0) - printk(" "); - if ((i & 0xf) == 0) - printk("\n "); - printk("%02x ", (int)dump[i]); - } - printk("\n"); - - return; -} -#else -#define sbp2util_packet_dump(w,x,y,z) do {} while (0) -#endif - static DECLARE_WAIT_QUEUE_HEAD(access_wq); /* @@ -587,13 +506,11 @@ static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_i pci_map_single(hi->host->pdev, &command->command_orb, sizeof(struct sbp2_command_orb), PCI_DMA_TODEVICE); - SBP2_DMA_ALLOC("single command orb DMA"); command->sge_dma = pci_map_single(hi->host->pdev, &command->scatter_gather_element, sizeof(command->scatter_gather_element), PCI_DMA_BIDIRECTIONAL); - SBP2_DMA_ALLOC("scatter_gather_element"); INIT_LIST_HEAD(&command->list); list_add_tail(&command->list, &scsi_id->sbp2_command_orb_completed); } @@ -620,12 +537,9 @@ static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_ pci_unmap_single(host->pdev, command->command_orb_dma, sizeof(struct sbp2_command_orb), PCI_DMA_TODEVICE); - SBP2_DMA_FREE("single command orb DMA"); pci_unmap_single(host->pdev, command->sge_dma, sizeof(command->scatter_gather_element), PCI_DMA_BIDIRECTIONAL); - SBP2_DMA_FREE("scatter_gather_element"); - kfree(command); } } @@ -653,9 +567,6 @@ static struct sbp2_command_info *sbp2util_find_command_for_orb( } } spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); - - SBP2_ORB_DEBUG("could not match command orb %x", (unsigned int)orb); - return NULL; } @@ -718,15 +629,13 @@ static void sbp2util_free_command_dma(struct sbp2_command_info *command) host = scsi_id->ud->ne->host; if (command->cmd_dma) { - if (command->dma_type == CMD_DMA_SINGLE) { + if (command->dma_type == CMD_DMA_SINGLE) pci_unmap_single(host->pdev, command->cmd_dma, command->dma_size, command->dma_dir); - SBP2_DMA_FREE("single bulk"); - } else if (command->dma_type == CMD_DMA_PAGE) { + else if (command->dma_type == CMD_DMA_PAGE) pci_unmap_page(host->pdev, command->cmd_dma, command->dma_size, command->dma_dir); - SBP2_DMA_FREE("single page"); - } /* XXX: Check for CMD_DMA_NONE bug */ + /* XXX: Check for CMD_DMA_NONE bug */ command->dma_type = CMD_DMA_NONE; command->cmd_dma = 0; } @@ -734,7 +643,6 @@ static void sbp2util_free_command_dma(struct sbp2_command_info *command) if (command->sge_buffer) { pci_unmap_sg(host->pdev, command->sge_buffer, command->dma_size, command->dma_dir); - SBP2_DMA_FREE("scatter list"); command->sge_buffer = NULL; } } @@ -769,8 +677,6 @@ static int sbp2_probe(struct device *dev) struct unit_directory *ud; struct scsi_id_instance_data *scsi_id; - SBP2_DEBUG_ENTER(); - ud = container_of(dev, struct unit_directory, device); /* Don't probe UD's that have the LUN flag. We'll probe the LUN(s) @@ -794,8 +700,6 @@ static int sbp2_remove(struct device *dev) struct scsi_id_instance_data *scsi_id; struct scsi_device *sdev; - SBP2_DEBUG_ENTER(); - ud = container_of(dev, struct unit_directory, device); scsi_id = ud->device.driver_data; if (!scsi_id) @@ -827,8 +731,6 @@ static int sbp2_update(struct unit_directory *ud) { struct scsi_id_instance_data *scsi_id = ud->device.driver_data; - SBP2_DEBUG_ENTER(); - if (sbp2_reconnect_device(scsi_id)) { /* @@ -877,8 +779,6 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud struct Scsi_Host *scsi_host = NULL; struct scsi_id_instance_data *scsi_id = NULL; - SBP2_DEBUG_ENTER(); - scsi_id = kzalloc(sizeof(*scsi_id), GFP_KERNEL); if (!scsi_id) { SBP2_ERR("failed to create scsi_id"); @@ -906,7 +806,6 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud SBP2_ERR("failed to allocate hostinfo"); goto failed_alloc; } - SBP2_DEBUG("sbp2_alloc_device: allocated hostinfo"); hi->host = ud->ne->host; INIT_LIST_HEAD(&hi->scsi_ids); @@ -997,8 +896,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) struct sbp2scsi_host_info *hi = scsi_id->hi; int error; - SBP2_DEBUG_ENTER(); - /* Login FIFO DMA */ scsi_id->login_response = pci_alloc_consistent(hi->host->pdev, @@ -1006,7 +903,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) &scsi_id->login_response_dma); if (!scsi_id->login_response) goto alloc_fail; - SBP2_DMA_ALLOC("consistent DMA region for login FIFO"); /* Query logins ORB DMA */ scsi_id->query_logins_orb = @@ -1015,7 +911,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) &scsi_id->query_logins_orb_dma); if (!scsi_id->query_logins_orb) goto alloc_fail; - SBP2_DMA_ALLOC("consistent DMA region for query logins ORB"); /* Query logins response DMA */ scsi_id->query_logins_response = @@ -1024,7 +919,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) &scsi_id->query_logins_response_dma); if (!scsi_id->query_logins_response) goto alloc_fail; - SBP2_DMA_ALLOC("consistent DMA region for query logins response"); /* Reconnect ORB DMA */ scsi_id->reconnect_orb = @@ -1033,7 +927,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) &scsi_id->reconnect_orb_dma); if (!scsi_id->reconnect_orb) goto alloc_fail; - SBP2_DMA_ALLOC("consistent DMA region for reconnect ORB"); /* Logout ORB DMA */ scsi_id->logout_orb = @@ -1042,7 +935,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) &scsi_id->logout_orb_dma); if (!scsi_id->logout_orb) goto alloc_fail; - SBP2_DMA_ALLOC("consistent DMA region for logout ORB"); /* Login ORB DMA */ scsi_id->login_orb = @@ -1051,9 +943,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) &scsi_id->login_orb_dma); if (!scsi_id->login_orb) goto alloc_fail; - SBP2_DMA_ALLOC("consistent DMA region for login ORB"); - - SBP2_DEBUG("New SBP-2 device inserted, SCSI ID = %x", scsi_id->ud->id); /* * Create our command orb pool @@ -1123,8 +1012,6 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) { struct sbp2scsi_host_info *hi; - SBP2_DEBUG_ENTER(); - if (!scsi_id) return; @@ -1140,53 +1027,36 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) list_del(&scsi_id->scsi_list); - if (scsi_id->login_response) { + if (scsi_id->login_response) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_login_response), scsi_id->login_response, scsi_id->login_response_dma); - SBP2_DMA_FREE("single login FIFO"); - } - - if (scsi_id->login_orb) { + if (scsi_id->login_orb) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_login_orb), scsi_id->login_orb, scsi_id->login_orb_dma); - SBP2_DMA_FREE("single login ORB"); - } - - if (scsi_id->reconnect_orb) { + if (scsi_id->reconnect_orb) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_reconnect_orb), scsi_id->reconnect_orb, scsi_id->reconnect_orb_dma); - SBP2_DMA_FREE("single reconnect orb"); - } - - if (scsi_id->logout_orb) { + if (scsi_id->logout_orb) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_logout_orb), scsi_id->logout_orb, scsi_id->logout_orb_dma); - SBP2_DMA_FREE("single logout orb"); - } - - if (scsi_id->query_logins_orb) { + if (scsi_id->query_logins_orb) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_orb), scsi_id->query_logins_orb, scsi_id->query_logins_orb_dma); - SBP2_DMA_FREE("single query logins orb"); - } - - if (scsi_id->query_logins_response) { + if (scsi_id->query_logins_response) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_response), scsi_id->query_logins_response, scsi_id->query_logins_response_dma); - SBP2_DMA_FREE("single query logins data"); - } if (scsi_id->status_fifo_addr != CSR1212_INVALID_ADDR_SPACE) hpsb_unregister_addrspace(&sbp2_highlevel, hi->host, @@ -1197,8 +1067,6 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) if (hi) module_put(hi->host->driver->owner); - SBP2_DEBUG("SBP-2 device removed, SCSI ID = %d", scsi_id->ud->id); - kfree(scsi_id); } @@ -1216,8 +1084,6 @@ static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, * Manually put the data in the right place. */ memcpy(bus_to_virt((u32) addr), data, length); - sbp2util_packet_dump(data, length, "sbp2 phys dma write by device", - (u32) addr); return RCODE_COMPLETE; } @@ -1234,8 +1100,6 @@ static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, * Grab data from memory and send a read response. */ memcpy(data, bus_to_virt((u32) addr), length); - sbp2util_packet_dump(data, length, "sbp2 phys dma read by device", - (u32) addr); return RCODE_COMPLETE; } #endif @@ -1255,8 +1119,6 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) int max_logins; int active_logins; - SBP2_DEBUG_ENTER(); - scsi_id->query_logins_orb->reserved1 = 0x0; scsi_id->query_logins_orb->reserved2 = 0x0; @@ -1277,9 +1139,6 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) sbp2util_cpu_to_be32_buffer(scsi_id->query_logins_orb, sizeof(struct sbp2_query_logins_orb)); - sbp2util_packet_dump(scsi_id->query_logins_orb, sizeof(struct sbp2_query_logins_orb), - "sbp2 query logins orb", scsi_id->query_logins_orb_dma); - memset(scsi_id->query_logins_response, 0, sizeof(struct sbp2_query_logins_response)); data[0] = ORB_SET_NODE_ID(hi->host->node_id); @@ -1305,9 +1164,6 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) sbp2util_cpu_to_be32_buffer(scsi_id->query_logins_response, sizeof(struct sbp2_query_logins_response)); - SBP2_DEBUG("length_max_logins = %x", - (unsigned int)scsi_id->query_logins_response->length_max_logins); - max_logins = RESPONSE_GET_MAX_LOGINS(scsi_id->query_logins_response->length_max_logins); SBP2_INFO("Maximum concurrent logins supported: %d", max_logins); @@ -1330,12 +1186,8 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) struct sbp2scsi_host_info *hi = scsi_id->hi; quadlet_t data[2]; - SBP2_DEBUG_ENTER(); - - if (!scsi_id->login_orb) { - SBP2_DEBUG("%s: login_orb not alloc'd!", __FUNCTION__); + if (!scsi_id->login_orb) return -EIO; - } if (!exclusive_login) { if (sbp2_query_logins(scsi_id)) { @@ -1367,9 +1219,6 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) sbp2util_cpu_to_be32_buffer(scsi_id->login_orb, sizeof(struct sbp2_login_orb)); - sbp2util_packet_dump(scsi_id->login_orb, sizeof(struct sbp2_login_orb), - "sbp2 login orb", scsi_id->login_orb_dma); - memset(scsi_id->login_response, 0, sizeof(struct sbp2_login_response)); data[0] = ORB_SET_NODE_ID(hi->host->node_id); @@ -1408,11 +1257,6 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) /* * Grab our command block agent address from the login response. */ - SBP2_DEBUG("command_block_agent_hi = %x", - (unsigned int)scsi_id->login_response->command_block_agent_hi); - SBP2_DEBUG("command_block_agent_lo = %x", - (unsigned int)scsi_id->login_response->command_block_agent_lo); - scsi_id->sbp2_command_block_agent_addr = ((u64)scsi_id->login_response->command_block_agent_hi) << 32; scsi_id->sbp2_command_block_agent_addr |= ((u64)scsi_id->login_response->command_block_agent_lo); @@ -1432,8 +1276,6 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) quadlet_t data[2]; int error; - SBP2_DEBUG_ENTER(); - /* * Set-up logout ORB */ @@ -1459,9 +1301,6 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) */ sbp2util_cpu_to_be32_buffer(scsi_id->logout_orb, sizeof(struct sbp2_logout_orb)); - sbp2util_packet_dump(scsi_id->logout_orb, sizeof(struct sbp2_logout_orb), - "sbp2 logout orb", scsi_id->logout_orb_dma); - /* * Ok, let's write to the target's management agent register */ @@ -1492,8 +1331,6 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) quadlet_t data[2]; int error; - SBP2_DEBUG_ENTER(); - /* * Set-up reconnect ORB */ @@ -1520,9 +1357,6 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) */ sbp2util_cpu_to_be32_buffer(scsi_id->reconnect_orb, sizeof(struct sbp2_reconnect_orb)); - sbp2util_packet_dump(scsi_id->reconnect_orb, sizeof(struct sbp2_reconnect_orb), - "sbp2 reconnect orb", scsi_id->reconnect_orb_dma); - data[0] = ORB_SET_NODE_ID(hi->host->node_id); data[1] = scsi_id->reconnect_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); @@ -1565,8 +1399,6 @@ static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id) { quadlet_t data; - SBP2_DEBUG_ENTER(); - data = cpu_to_be32(SBP2_BUSY_TIMEOUT_VALUE); if (hpsb_node_write(scsi_id->ne, SBP2_BUSY_TIMEOUT_ADDRESS, &data, 4)) SBP2_ERR("%s error", __FUNCTION__); @@ -1589,8 +1421,6 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, unsigned workarounds; int i; - SBP2_DEBUG_ENTER(); - management_agent_addr = 0x0; command_set_spec_id = 0x0; command_set = 0x0; @@ -1601,32 +1431,25 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) { switch (kv->key.id) { case CSR1212_KV_ID_DEPENDENT_INFO: - if (kv->key.type == CSR1212_KV_TYPE_CSR_OFFSET) { + if (kv->key.type == CSR1212_KV_TYPE_CSR_OFFSET) /* Save off the management agent address */ management_agent_addr = CSR1212_REGISTER_SPACE_BASE + (kv->value.csr_offset << 2); - SBP2_DEBUG("sbp2_management_agent_addr = %x", - (unsigned int)management_agent_addr); - } else if (kv->key.type == CSR1212_KV_TYPE_IMMEDIATE) { + else if (kv->key.type == CSR1212_KV_TYPE_IMMEDIATE) scsi_id->sbp2_lun = ORB_SET_LUN(kv->value.immediate); - } break; case SBP2_COMMAND_SET_SPEC_ID_KEY: /* Command spec organization */ command_set_spec_id = kv->value.immediate; - SBP2_DEBUG("sbp2_command_set_spec_id = %x", - (unsigned int)command_set_spec_id); break; case SBP2_COMMAND_SET_KEY: /* Command set used by sbp2 device */ command_set = kv->value.immediate; - SBP2_DEBUG("sbp2_command_set = %x", - (unsigned int)command_set); break; case SBP2_UNIT_CHARACTERISTICS_KEY: @@ -1635,15 +1458,11 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, * that I'm not yet paying attention to) */ unit_characteristics = kv->value.immediate; - SBP2_DEBUG("sbp2_unit_characteristics = %x", - (unsigned int)unit_characteristics); break; case SBP2_FIRMWARE_REVISION_KEY: /* Firmware revision */ firmware_revision = kv->value.immediate; - SBP2_DEBUG("sbp2_firmware_revision = %x", - (unsigned int)firmware_revision); break; default: @@ -1719,8 +1538,6 @@ static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id) struct sbp2scsi_host_info *hi = scsi_id->hi; u8 payload; - SBP2_DEBUG_ENTER(); - scsi_id->speed_code = hi->host->speed[NODEID_TO_NODE(scsi_id->ne->nodeid)]; @@ -1761,8 +1578,6 @@ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) int retval; unsigned long flags; - SBP2_DEBUG_ENTER(); - cancel_delayed_work(&scsi_id->protocol_work); if (wait) flush_scheduled_work(); @@ -1806,7 +1621,6 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, if ((scsi_use_sg == 1) && (sgpnt[0].length <= SBP2_MAX_SG_ELEMENT_LENGTH)) { - SBP2_DEBUG("Only one s/g element"); command->dma_size = sgpnt[0].length; command->dma_type = CMD_DMA_PAGE; command->cmd_dma = pci_map_page(hi->host->pdev, @@ -1814,7 +1628,6 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, sgpnt[0].offset, command->dma_size, command->dma_dir); - SBP2_DMA_ALLOC("single page scatter element"); orb->data_descriptor_lo = command->cmd_dma; orb->misc |= ORB_SET_DATA_SIZE(command->dma_size); @@ -1827,8 +1640,6 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, int i, count = pci_map_sg(hi->host->pdev, sgpnt, scsi_use_sg, dma_dir); - SBP2_DMA_ALLOC("scatter list"); - command->dma_size = scsi_use_sg; command->sge_buffer = sgpnt; @@ -1862,10 +1673,6 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, /* Number of page table (s/g) elements */ orb->misc |= ORB_SET_DATA_SIZE(sg_count); - sbp2util_packet_dump(sg_element, - (sizeof(struct sbp2_unrestricted_page_table)) * sg_count, - "sbp2 s/g list", command->sge_dma); - /* Byte swap page tables if necessary */ sbp2util_cpu_to_be32_buffer(sg_element, (sizeof(struct sbp2_unrestricted_page_table)) * @@ -1890,8 +1697,6 @@ static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id); orb->misc |= ORB_SET_DIRECTION(orb_direction); - SBP2_DMA_ALLOC("single bulk"); - /* * Handle case where we get a command w/o s/g enabled (but * check for transfers larger than 64K) @@ -1941,10 +1746,6 @@ static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, /* Number of page table (s/g) elements */ orb->misc |= ORB_SET_DATA_SIZE(sg_count); - sbp2util_packet_dump(sg_element, - (sizeof(struct sbp2_unrestricted_page_table)) * sg_count, - "sbp2 s/g list", command->sge_dma); - /* Byte swap page tables if necessary */ sbp2util_cpu_to_be32_buffer(sg_element, (sizeof(struct sbp2_unrestricted_page_table)) * @@ -1996,20 +1797,16 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, /* Set-up our pagetable stuff */ if (orb_direction == ORB_DIRECTION_NO_DATA_TRANSFER) { - SBP2_DEBUG("No data transfer"); command_orb->data_descriptor_hi = 0x0; command_orb->data_descriptor_lo = 0x0; command_orb->misc |= ORB_SET_DIRECTION(1); - } else if (scsi_use_sg) { - SBP2_DEBUG("Use scatter/gather"); + } else if (scsi_use_sg) sbp2_prep_command_orb_sg(command_orb, hi, command, scsi_use_sg, sgpnt, orb_direction, dma_dir); - } else { - SBP2_DEBUG("No scatter/gather"); + else sbp2_prep_command_orb_no_sg(command_orb, hi, command, sgpnt, orb_direction, scsi_request_bufflen, scsi_request_buffer, dma_dir); - } /* Byte swap command ORB if necessary */ sbp2util_cpu_to_be32_buffer(command_orb, sizeof(struct sbp2_command_orb)); @@ -2034,10 +1831,6 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, size_t length; unsigned long flags; - outstanding_orb_incr; - SBP2_ORB_DEBUG("sending command orb %p, total orbs = %x", - command_orb, global_outstanding_command_orbs); - pci_dma_sync_single_for_device(hi->host->pdev, command->command_orb_dma, sizeof(struct sbp2_command_orb), PCI_DMA_TODEVICE); @@ -2086,8 +1879,6 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, scsi_id->last_orb_dma = command->command_orb_dma; spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); - SBP2_ORB_DEBUG("write to %s register, command orb %p", - last_orb ? "DOORBELL" : "ORB_POINTER", command_orb); if (sbp2util_node_write_no_wait(scsi_id->ne, addr, data, length)) { /* * sbp2util_node_write_no_wait failed. We certainly ran out @@ -2116,17 +1907,12 @@ static int sbp2_send_command(struct scsi_id_instance_data *scsi_id, unsigned int request_bufflen = SCpnt->request_bufflen; struct sbp2_command_info *command; - SBP2_DEBUG_ENTER(); - SBP2_DEBUG("SCSI transfer size = %x", request_bufflen); - SBP2_DEBUG("SCSI s/g elements = %x", (unsigned int)SCpnt->use_sg); - /* * Allocate a command orb and s/g structure */ command = sbp2util_allocate_command_orb(scsi_id, SCpnt, done); - if (!command) { + if (!command) return -EIO; - } /* * Now actually fill in the comamnd orb and sbp2 s/g list @@ -2135,9 +1921,6 @@ static int sbp2_send_command(struct scsi_id_instance_data *scsi_id, request_bufflen, SCpnt->request_buffer, SCpnt->sc_data_direction); - sbp2util_packet_dump(&command->command_orb, sizeof(struct sbp2_command_orb), - "sbp2 command orb", command->command_orb_dma); - /* * Link up the orb, and ring the doorbell if needed */ @@ -2151,8 +1934,6 @@ static int sbp2_send_command(struct scsi_id_instance_data *scsi_id, */ static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense_data) { - SBP2_DEBUG_ENTER(); - /* * Ok, it's pretty ugly... ;-) */ @@ -2191,10 +1972,6 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, struct sbp2_command_info *command; unsigned long flags; - SBP2_DEBUG_ENTER(); - - sbp2util_packet_dump(data, length, "sbp2 status write by device", (u32)addr); - if (unlikely(length < 8 || length > sizeof(struct sbp2_status_block))) { SBP2_ERR("Wrong size of status block"); return RCODE_ADDRESS_ERROR; @@ -2244,17 +2021,12 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, command = sbp2util_find_command_for_orb(scsi_id, sb->ORB_offset_lo); if (command) { - SBP2_DEBUG("Found status for command ORB"); pci_dma_sync_single_for_cpu(hi->host->pdev, command->command_orb_dma, sizeof(struct sbp2_command_orb), PCI_DMA_TODEVICE); pci_dma_sync_single_for_cpu(hi->host->pdev, command->sge_dma, sizeof(command->scatter_gather_element), PCI_DMA_BIDIRECTIONAL); - - SBP2_ORB_DEBUG("matched command orb %p", &command->command_orb); - outstanding_orb_decr; - /* * Matched status with command, now grab scsi command pointers * and check status. @@ -2283,21 +2055,15 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, /* * See if the target stored any scsi status information. */ - if (STATUS_GET_LEN(h) > 1) { - SBP2_DEBUG("CHECK CONDITION"); + if (STATUS_GET_LEN(h) > 1) scsi_status = sbp2_status_to_sense_data( (unchar *)sb, SCpnt->sense_buffer); - } /* * Check to see if the dead bit is set. If so, we'll * have to initiate a fetch agent reset. */ - if (STATUS_TEST_DEAD(h)) { - SBP2_DEBUG("Dead bit set - " - "initiating fetch agent reset"); + if (STATUS_TEST_DEAD(h)) sbp2_agent_reset(scsi_id, 0); - } - SBP2_ORB_DEBUG("completing command orb %p", &command->command_orb); } /* @@ -2326,13 +2092,9 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, } } - if (SCpnt) { - SBP2_DEBUG("Completing SCSI command"); + if (SCpnt) sbp2scsi_complete_command(scsi_id, scsi_status, SCpnt, command->Current_done); - SBP2_ORB_DEBUG("command orb completed"); - } - return RCODE_COMPLETE; } @@ -2352,11 +2114,6 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, struct sbp2scsi_host_info *hi; int result = DID_NO_CONNECT << 16; - SBP2_DEBUG_ENTER(); -#if (CONFIG_IEEE1394_SBP2_DEBUG >= 2) || defined(CONFIG_IEEE1394_SBP2_PACKET_DUMP) - scsi_print_command(SCpnt); -#endif - if (!sbp2util_node_is_available(scsi_id)) goto done; @@ -2379,7 +2136,6 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, * (autorequest sense) */ if (SCpnt->cmnd[0] == REQUEST_SENSE) { - SBP2_DEBUG("REQUEST_SENSE"); memcpy(SCpnt->request_buffer, SCpnt->sense_buffer, SCpnt->request_bufflen); memset(SCpnt->sense_buffer, 0, sizeof(SCpnt->sense_buffer)); sbp2scsi_complete_command(scsi_id, SBP2_SCSI_STATUS_GOOD, SCpnt, done); @@ -2433,11 +2189,8 @@ static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id struct sbp2_command_info *command; unsigned long flags; - SBP2_DEBUG_ENTER(); - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); while (!list_empty(&scsi_id->sbp2_command_orb_inuse)) { - SBP2_DEBUG("Found pending command to complete"); lh = scsi_id->sbp2_command_orb_inuse.next; command = list_entry(lh, struct sbp2_command_info, list); pci_dma_sync_single_for_cpu(hi->host->pdev, command->command_orb_dma, @@ -2466,8 +2219,6 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, u32 scsi_status, struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) { - SBP2_DEBUG_ENTER(); - /* * Sanity */ @@ -2490,12 +2241,7 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, break; case SBP2_SCSI_STATUS_CHECK_CONDITION: - SBP2_DEBUG("SBP2_SCSI_STATUS_CHECK_CONDITION"); SCpnt->result = CHECK_CONDITION << 1 | DID_OK << 16; -#if CONFIG_IEEE1394_SBP2_DEBUG >= 1 - scsi_print_command(SCpnt); - scsi_print_sense(SBP2_DEVICE_NAME, SCpnt); -#endif break; case SBP2_SCSI_STATUS_SELECTION_TIMEOUT: @@ -2590,7 +2336,6 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); command = sbp2util_find_command_for_SCpnt(scsi_id, SCpnt); if (command) { - SBP2_DEBUG("Found command to abort"); pci_dma_sync_single_for_cpu(hi->host->pdev, command->command_orb_dma, sizeof(struct sbp2_command_orb), @@ -2660,8 +2405,6 @@ static int sbp2_module_init(void) { int ret; - SBP2_DEBUG_ENTER(); - /* Module load debug option to force one command at a time (serializing I/O) */ if (serialize_io) { scsi_driver_template.can_queue = 1; @@ -2688,10 +2431,7 @@ static int sbp2_module_init(void) static void __exit sbp2_module_exit(void) { - SBP2_DEBUG_ENTER(); - hpsb_unregister_protocol(&sbp2_driver); - hpsb_unregister_highlevel(&sbp2_highlevel); } -- cgit v1.1 From 424a9642b8b436bba04ad5d2d254b43757166cdf Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: coding style of some macros Adjust parentheses, indentation, line lengths. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.h | 155 ++++++++++++++++++++++++------------------------ 1 file changed, 78 insertions(+), 77 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index 56917b9..7b42420 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -28,22 +28,22 @@ * SBP2 specific structures and defines */ -#define ORB_DIRECTION_WRITE_TO_MEDIA 0x0 -#define ORB_DIRECTION_READ_FROM_MEDIA 0x1 -#define ORB_DIRECTION_NO_DATA_TRANSFER 0x2 - -#define ORB_SET_NULL_PTR(value) ((value & 0x1) << 31) -#define ORB_SET_NOTIFY(value) ((value & 0x1) << 31) -#define ORB_SET_RQ_FMT(value) ((value & 0x3) << 29) /* unused ? */ -#define ORB_SET_NODE_ID(value) ((value & 0xffff) << 16) -#define ORB_SET_STATUS_FIFO_HI(value, id) (value >> 32 | ORB_SET_NODE_ID(id)) -#define ORB_SET_STATUS_FIFO_LO(value) (value & 0xffffffff) -#define ORB_SET_DATA_SIZE(value) (value & 0xffff) -#define ORB_SET_PAGE_SIZE(value) ((value & 0x7) << 16) -#define ORB_SET_PAGE_TABLE_PRESENT(value) ((value & 0x1) << 19) -#define ORB_SET_MAX_PAYLOAD(value) ((value & 0xf) << 20) -#define ORB_SET_SPEED(value) ((value & 0x7) << 24) -#define ORB_SET_DIRECTION(value) ((value & 0x1) << 27) +#define ORB_DIRECTION_WRITE_TO_MEDIA 0x0 +#define ORB_DIRECTION_READ_FROM_MEDIA 0x1 +#define ORB_DIRECTION_NO_DATA_TRANSFER 0x2 + +#define ORB_SET_NULL_PTR(v) (((v) & 0x1) << 31) +#define ORB_SET_NOTIFY(v) (((v) & 0x1) << 31) +#define ORB_SET_RQ_FMT(v) (((v) & 0x3) << 29) +#define ORB_SET_NODE_ID(v) (((v) & 0xffff) << 16) +#define ORB_SET_STATUS_FIFO_HI(v, id) ((v) >> 32 | ORB_SET_NODE_ID(id)) +#define ORB_SET_STATUS_FIFO_LO(v) ((v) & 0xffffffff) +#define ORB_SET_DATA_SIZE(v) ((v) & 0xffff) +#define ORB_SET_PAGE_SIZE(v) (((v) & 0x7) << 16) +#define ORB_SET_PAGE_TABLE_PRESENT(v) (((v) & 0x1) << 19) +#define ORB_SET_MAX_PAYLOAD(v) (((v) & 0xf) << 20) +#define ORB_SET_SPEED(v) (((v) & 0x7) << 24) +#define ORB_SET_DIRECTION(v) (((v) & 0x1) << 27) struct sbp2_command_orb { u32 next_ORB_hi; @@ -64,12 +64,12 @@ struct sbp2_command_orb { #define SBP2_LOGICAL_UNIT_RESET 0xe #define SBP2_TARGET_RESET_REQUEST 0xf -#define ORB_SET_LUN(value) (value & 0xffff) -#define ORB_SET_FUNCTION(value) ((value & 0xf) << 16) -#define ORB_SET_RECONNECT(value) ((value & 0xf) << 20) -#define ORB_SET_EXCLUSIVE(value) ((value & 0x1) << 28) -#define ORB_SET_LOGIN_RESP_LENGTH(value) (value & 0xffff) -#define ORB_SET_PASSWD_LENGTH(value) ((value & 0xffff) << 16) +#define ORB_SET_LUN(v) ((v) & 0xffff) +#define ORB_SET_FUNCTION(v) (((v) & 0xf) << 16) +#define ORB_SET_RECONNECT(v) (((v) & 0xf) << 20) +#define ORB_SET_EXCLUSIVE(v) (((v) & 0x1) << 28) +#define ORB_SET_LOGIN_RESP_LENGTH(v) ((v) & 0xffff) +#define ORB_SET_PASSWD_LENGTH(v) (((v) & 0xffff) << 16) struct sbp2_login_orb { u32 password_hi; @@ -82,9 +82,9 @@ struct sbp2_login_orb { u32 status_fifo_lo; } __attribute__((packed)); -#define RESPONSE_GET_LOGIN_ID(value) (value & 0xffff) -#define RESPONSE_GET_LENGTH(value) ((value >> 16) & 0xffff) -#define RESPONSE_GET_RECONNECT_HOLD(value) (value & 0xffff) +#define RESPONSE_GET_LOGIN_ID(v) ((v) & 0xffff) +#define RESPONSE_GET_LENGTH(v) (((v) >> 16) & 0xffff) +#define RESPONSE_GET_RECONNECT_HOLD(v) ((v) & 0xffff) struct sbp2_login_response { u32 length_login_ID; @@ -93,9 +93,8 @@ struct sbp2_login_response { u32 reconnect_hold; } __attribute__((packed)); -#define ORB_SET_LOGIN_ID(value) (value & 0xffff) - -#define ORB_SET_QUERY_LOGINS_RESP_LENGTH(value) (value & 0xffff) +#define ORB_SET_LOGIN_ID(v) ((v) & 0xffff) +#define ORB_SET_QUERY_LOGINS_RESP_LENGTH(v) ((v) & 0xffff) struct sbp2_query_logins_orb { u32 reserved1; @@ -108,8 +107,8 @@ struct sbp2_query_logins_orb { u32 status_fifo_lo; } __attribute__((packed)); -#define RESPONSE_GET_MAX_LOGINS(value) (value & 0xffff) -#define RESPONSE_GET_ACTIVE_LOGINS(value) ((RESPONSE_GET_LENGTH(value) - 4) / 12) +#define RESPONSE_GET_MAX_LOGINS(v) ((v) & 0xffff) +#define RESPONSE_GET_ACTIVE_LOGINS(v) ((RESPONSE_GET_LENGTH((v)) - 4) / 12) struct sbp2_query_logins_response { u32 length_max_logins; @@ -140,8 +139,8 @@ struct sbp2_logout_orb { u32 status_fifo_lo; } __attribute__((packed)); -#define PAGE_TABLE_SET_SEGMENT_BASE_HI(value) (value & 0xffff) -#define PAGE_TABLE_SET_SEGMENT_LENGTH(value) ((value & 0xffff) << 16) +#define PAGE_TABLE_SET_SEGMENT_BASE_HI(v) ((v) & 0xffff) +#define PAGE_TABLE_SET_SEGMENT_LENGTH(v) (((v) & 0xffff) << 16) struct sbp2_unrestricted_page_table { u32 length_segment_base_hi; @@ -171,23 +170,14 @@ struct sbp2_unrestricted_page_table { #define SFMT_DEFERRED_ERROR 0x1 #define SFMT_VENDOR_DEPENDENT_STATUS 0x3 -#define SBP2_SCSI_STATUS_GOOD 0x0 -#define SBP2_SCSI_STATUS_CHECK_CONDITION 0x2 -#define SBP2_SCSI_STATUS_CONDITION_MET 0x4 -#define SBP2_SCSI_STATUS_BUSY 0x8 -#define SBP2_SCSI_STATUS_RESERVATION_CONFLICT 0x18 -#define SBP2_SCSI_STATUS_COMMAND_TERMINATED 0x22 - -#define SBP2_SCSI_STATUS_SELECTION_TIMEOUT 0xff - -#define STATUS_GET_SRC(value) (((value) >> 30) & 0x3) -#define STATUS_GET_RESP(value) (((value) >> 28) & 0x3) -#define STATUS_GET_LEN(value) (((value) >> 24) & 0x7) -#define STATUS_GET_SBP_STATUS(value) (((value) >> 16) & 0xff) -#define STATUS_GET_ORB_OFFSET_HI(value) ((value) & 0x0000ffff) -#define STATUS_TEST_DEAD(value) ((value) & 0x08000000) +#define STATUS_GET_SRC(v) (((v) >> 30) & 0x3) +#define STATUS_GET_RESP(v) (((v) >> 28) & 0x3) +#define STATUS_GET_LEN(v) (((v) >> 24) & 0x7) +#define STATUS_GET_SBP_STATUS(v) (((v) >> 16) & 0xff) +#define STATUS_GET_ORB_OFFSET_HI(v) ((v) & 0x0000ffff) +#define STATUS_TEST_DEAD(v) ((v) & 0x08000000) /* test 'resp' | 'dead' | 'sbp2_status' */ -#define STATUS_TEST_RDS(value) ((value) & 0x38ff0000) +#define STATUS_TEST_RDS(v) ((v) & 0x38ff0000) struct sbp2_status_block { u32 ORB_offset_hi_misc; @@ -199,49 +189,53 @@ struct sbp2_status_block { * Miscellaneous SBP2 related config rom defines */ -#define SBP2_UNIT_DIRECTORY_OFFSET_KEY 0xd1 -#define SBP2_CSR_OFFSET_KEY 0x54 -#define SBP2_UNIT_SPEC_ID_KEY 0x12 -#define SBP2_UNIT_SW_VERSION_KEY 0x13 -#define SBP2_COMMAND_SET_SPEC_ID_KEY 0x38 -#define SBP2_COMMAND_SET_KEY 0x39 -#define SBP2_UNIT_CHARACTERISTICS_KEY 0x3a -#define SBP2_DEVICE_TYPE_AND_LUN_KEY 0x14 -#define SBP2_FIRMWARE_REVISION_KEY 0x3c +#define SBP2_UNIT_DIRECTORY_OFFSET_KEY 0xd1 +#define SBP2_CSR_OFFSET_KEY 0x54 +#define SBP2_UNIT_SPEC_ID_KEY 0x12 +#define SBP2_UNIT_SW_VERSION_KEY 0x13 +#define SBP2_COMMAND_SET_SPEC_ID_KEY 0x38 +#define SBP2_COMMAND_SET_KEY 0x39 +#define SBP2_UNIT_CHARACTERISTICS_KEY 0x3a +#define SBP2_DEVICE_TYPE_AND_LUN_KEY 0x14 +#define SBP2_FIRMWARE_REVISION_KEY 0x3c -#define SBP2_AGENT_STATE_OFFSET 0x00ULL -#define SBP2_AGENT_RESET_OFFSET 0x04ULL -#define SBP2_ORB_POINTER_OFFSET 0x08ULL -#define SBP2_DOORBELL_OFFSET 0x10ULL -#define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET 0x14ULL -#define SBP2_UNSOLICITED_STATUS_VALUE 0xf +#define SBP2_AGENT_STATE_OFFSET 0x00ULL +#define SBP2_AGENT_RESET_OFFSET 0x04ULL +#define SBP2_ORB_POINTER_OFFSET 0x08ULL +#define SBP2_DOORBELL_OFFSET 0x10ULL +#define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET 0x14ULL +#define SBP2_UNSOLICITED_STATUS_VALUE 0xf -#define SBP2_BUSY_TIMEOUT_ADDRESS 0xfffff0000210ULL -#define SBP2_BUSY_TIMEOUT_VALUE 0xf +#define SBP2_BUSY_TIMEOUT_ADDRESS 0xfffff0000210ULL +#define SBP2_BUSY_TIMEOUT_VALUE 0xf -#define SBP2_AGENT_RESET_DATA 0xf +#define SBP2_AGENT_RESET_DATA 0xf /* * Unit spec id and sw version entry for SBP-2 devices */ -#define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e -#define SBP2_SW_VERSION_ENTRY 0x00010483 +#define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e +#define SBP2_SW_VERSION_ENTRY 0x00010483 /* * SCSI specific stuff */ -#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 -#define SBP2_MAX_SECTORS 255 /* Max sectors supported */ -#define SBP2_MAX_CMDS 8 /* This should be safe */ +#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 +#define SBP2_MAX_SECTORS 255 +/* There is no real limitation of the queue depth (i.e. length of the linked + * list of command ORBs) at the target. The chosen depth is merely an + * implementation detail of the sbp2 driver. */ +#define SBP2_MAX_CMDS 8 -/* Flags for detected oddities and brokeness */ -#define SBP2_WORKAROUND_128K_MAX_TRANS 0x1 -#define SBP2_WORKAROUND_INQUIRY_36 0x2 -#define SBP2_WORKAROUND_MODE_SENSE_8 0x4 -#define SBP2_WORKAROUND_FIX_CAPACITY 0x8 -#define SBP2_WORKAROUND_OVERRIDE 0x100 +#define SBP2_SCSI_STATUS_GOOD 0x0 +#define SBP2_SCSI_STATUS_CHECK_CONDITION 0x2 +#define SBP2_SCSI_STATUS_CONDITION_MET 0x4 +#define SBP2_SCSI_STATUS_BUSY 0x8 +#define SBP2_SCSI_STATUS_RESERVATION_CONFLICT 0x18 +#define SBP2_SCSI_STATUS_COMMAND_TERMINATED 0x22 +#define SBP2_SCSI_STATUS_SELECTION_TIMEOUT 0xff /* This is the two dma types we use for cmd_dma below */ enum cmd_dma_types { @@ -364,4 +358,11 @@ struct sbp2scsi_host_info { struct list_head scsi_ids; /* List of scsi ids on this host */ }; +/* Flags for detected oddities and brokeness */ +#define SBP2_WORKAROUND_128K_MAX_TRANS 0x1 +#define SBP2_WORKAROUND_INQUIRY_36 0x2 +#define SBP2_WORKAROUND_MODE_SENSE_8 0x4 +#define SBP2_WORKAROUND_FIX_CAPACITY 0x8 +#define SBP2_WORKAROUND_OVERRIDE 0x100 + #endif /* SBP2_H */ -- cgit v1.1 From d19c77641412a257fa651662b96fec826e9e7e60 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 7 Dec 2006 22:40:33 +0100 Subject: ieee1394: sbp2: delayed_work -> work_struct This work is not delayed. Also bring the code format in a state which reduces my work to merge pending sbp2 patchs. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 26 +++++++++++--------------- drivers/ieee1394/sbp2.h | 2 +- 2 files changed, 12 insertions(+), 16 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 6bd26a9..5156b88 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -462,23 +462,18 @@ static void sbp2util_notify_fetch_agent(struct scsi_id_instance_data *scsi_id, static void sbp2util_write_orb_pointer(struct work_struct *work) { - struct scsi_id_instance_data *scsi_id = - container_of(work, struct scsi_id_instance_data, - protocol_work.work); quadlet_t data[2]; - data[0] = ORB_SET_NODE_ID(scsi_id->hi->host->node_id); - data[1] = scsi_id->last_orb_dma; + data[0] = ORB_SET_NODE_ID( + (container_of(work, struct scsi_id_instance_data, protocol_work))->hi->host->node_id); + data[1] = (container_of(work, struct scsi_id_instance_data, protocol_work))->last_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - sbp2util_notify_fetch_agent(scsi_id, SBP2_ORB_POINTER_OFFSET, data, 8); + sbp2util_notify_fetch_agent(container_of(work, struct scsi_id_instance_data, protocol_work), SBP2_ORB_POINTER_OFFSET, data, 8); } static void sbp2util_write_doorbell(struct work_struct *work) { - struct scsi_id_instance_data *scsi_id = - container_of(work, struct scsi_id_instance_data, - protocol_work.work); - sbp2util_notify_fetch_agent(scsi_id, SBP2_DOORBELL_OFFSET, NULL, 4); + sbp2util_notify_fetch_agent(container_of(work, struct scsi_id_instance_data, protocol_work), SBP2_DOORBELL_OFFSET, NULL, 4); } /* @@ -795,7 +790,7 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud INIT_LIST_HEAD(&scsi_id->scsi_list); spin_lock_init(&scsi_id->sbp2_command_orb_lock); atomic_set(&scsi_id->state, SBP2LU_STATE_RUNNING); - INIT_DELAYED_WORK(&scsi_id->protocol_work, NULL); + INIT_WORK(&scsi_id->protocol_work, NULL); ud->device.driver_data = scsi_id; @@ -1578,7 +1573,7 @@ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) int retval; unsigned long flags; - cancel_delayed_work(&scsi_id->protocol_work); + /* cancel_delayed_work(&scsi_id->protocol_work); */ if (wait) flush_scheduled_work(); @@ -1889,10 +1884,11 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, * We do not accept new commands until the job is over. */ scsi_block_requests(scsi_id->scsi_host); - PREPARE_DELAYED_WORK(&scsi_id->protocol_work, + PREPARE_WORK(&scsi_id->protocol_work, last_orb ? sbp2util_write_doorbell: - sbp2util_write_orb_pointer); - schedule_delayed_work(&scsi_id->protocol_work, 0); + sbp2util_write_orb_pointer + /* */); + schedule_work(&scsi_id->protocol_work); } } diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index 7b42420..5483b45 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -342,7 +342,7 @@ struct scsi_id_instance_data { unsigned workarounds; atomic_t state; - struct delayed_work protocol_work; + struct work_struct protocol_work; }; /* For use in scsi_id_instance_data.state */ -- cgit v1.1 From e8ca5668f1546dacc85abcc06511ed113fd929c3 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: remove superfluous comments And update and reformat remaining comments. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 384 ++++++++++-------------------------------------- drivers/ieee1394/sbp2.h | 80 +++++----- 2 files changed, 109 insertions(+), 355 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 5156b88..625f1eb 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -404,15 +404,15 @@ static int sbp2util_access_timeout(struct scsi_id_instance_data *scsi_id, return leftover <= 0; } -/* Frees an allocated packet */ static void sbp2_free_packet(struct hpsb_packet *packet) { hpsb_free_tlabel(packet); hpsb_free_packet(packet); } -/* This is much like hpsb_node_write(), except it ignores the response - * subaction and returns immediately. Can be used from interrupts. +/* + * This is much like hpsb_node_write(), except it ignores the response + * subaction and returns immediately. Can be used from atomic context. */ static int sbp2util_node_write_no_wait(struct node_entry *ne, u64 addr, quadlet_t *buffer, size_t length) @@ -476,10 +476,6 @@ static void sbp2util_write_doorbell(struct work_struct *work) sbp2util_notify_fetch_agent(container_of(work, struct scsi_id_instance_data, protocol_work), SBP2_DOORBELL_OFFSET, NULL, 4); } -/* - * This function is called to create a pool of command orbs used for - * command processing. It is called when a new sbp2 device is detected. - */ static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id) { struct sbp2scsi_host_info *hi = scsi_id->hi; @@ -513,9 +509,6 @@ static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_i return 0; } -/* - * This function is called to delete a pool of command orbs. - */ static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id) { struct hpsb_host *host = scsi_id->hi->host; @@ -527,8 +520,6 @@ static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_ if (!list_empty(&scsi_id->sbp2_command_orb_completed)) { list_for_each_safe(lh, next, &scsi_id->sbp2_command_orb_completed) { command = list_entry(lh, struct sbp2_command_info, list); - - /* Release our generic DMA's */ pci_unmap_single(host->pdev, command->command_orb_dma, sizeof(struct sbp2_command_orb), PCI_DMA_TODEVICE); @@ -543,8 +534,8 @@ static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_ } /* - * This function finds the sbp2_command for a given outstanding command - * orb.Only looks at the inuse list. + * Finds the sbp2_command for a given outstanding command ORB. + * Only looks at the in-use list. */ static struct sbp2_command_info *sbp2util_find_command_for_orb( struct scsi_id_instance_data *scsi_id, dma_addr_t orb) @@ -566,8 +557,8 @@ static struct sbp2_command_info *sbp2util_find_command_for_orb( } /* - * This function finds the sbp2_command for a given outstanding SCpnt. - * Only looks at the inuse list. + * Finds the sbp2_command for a given outstanding SCpnt. + * Only looks at the in-use list. * Must be called with scsi_id->sbp2_command_orb_lock held. */ static struct sbp2_command_info *sbp2util_find_command_for_SCpnt( @@ -582,9 +573,6 @@ static struct sbp2_command_info *sbp2util_find_command_for_SCpnt( return NULL; } -/* - * This function allocates a command orb used to send a scsi command. - */ static struct sbp2_command_info *sbp2util_allocate_command_orb( struct scsi_id_instance_data *scsi_id, struct scsi_cmnd *Current_SCpnt, @@ -609,7 +597,6 @@ static struct sbp2_command_info *sbp2util_allocate_command_orb( return command; } -/* Free our DMA's */ static void sbp2util_free_command_dma(struct sbp2_command_info *command) { struct scsi_id_instance_data *scsi_id = @@ -705,7 +692,7 @@ static int sbp2_remove(struct device *dev) * send them. */ if (!sbp2util_node_is_available(scsi_id)) sbp2scsi_complete_all_commands(scsi_id, DID_NO_CONNECT); - /* scsi_remove_device() will trigger shutdown functions of SCSI + /* scsi_remove_device() may trigger shutdown functions of SCSI * highlevel drivers which would deadlock if blocked. */ atomic_set(&scsi_id->state, SBP2LU_STATE_IN_SHUTDOWN); scsi_unblock_requests(scsi_id->scsi_host); @@ -727,12 +714,9 @@ static int sbp2_update(struct unit_directory *ud) struct scsi_id_instance_data *scsi_id = ud->device.driver_data; if (sbp2_reconnect_device(scsi_id)) { - - /* - * Ok, reconnect has failed. Perhaps we didn't - * reconnect fast enough. Try doing a regular login, but - * first do a logout just in case of any weirdness. - */ + /* Reconnect has failed. Perhaps we didn't reconnect fast + * enough. Try a regular login, but first log out just in + * case of any weirdness. */ sbp2_logout_device(scsi_id); if (sbp2_login_device(scsi_id)) { @@ -743,18 +727,12 @@ static int sbp2_update(struct unit_directory *ud) } } - /* Set max retries to something large on the device. */ sbp2_set_busy_timeout(scsi_id); - - /* Do a SBP-2 fetch agent reset. */ sbp2_agent_reset(scsi_id, 1); - - /* Get the max speed and packet size that we can use. */ sbp2_max_speed_and_size(scsi_id); - /* Complete any pending commands with busy (so they get - * retried) and remove them from our queue - */ + /* Complete any pending commands with busy (so they get retried) + * and remove them from our queue. */ sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY); /* Accept new commands unless there was another bus reset in the @@ -766,8 +744,6 @@ static int sbp2_update(struct unit_directory *ud) return 0; } -/* This functions is called by the sbp2_probe, for each new device. We now - * allocate one scsi host for each scsi_id (unit directory). */ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud) { struct sbp2scsi_host_info *hi; @@ -843,7 +819,6 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud goto failed_alloc; } - /* Register our host with the SCSI stack. */ scsi_host = scsi_host_alloc(&scsi_driver_template, sizeof(unsigned long)); if (!scsi_host) { @@ -882,16 +857,11 @@ static void sbp2_host_reset(struct hpsb_host *host) } } -/* - * This function is where we first pull the node unique ids, and then - * allocate memory and register a SBP-2 device. - */ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) { struct sbp2scsi_host_info *hi = scsi_id->hi; int error; - /* Login FIFO DMA */ scsi_id->login_response = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_login_response), @@ -899,7 +869,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) if (!scsi_id->login_response) goto alloc_fail; - /* Query logins ORB DMA */ scsi_id->query_logins_orb = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_orb), @@ -907,7 +876,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) if (!scsi_id->query_logins_orb) goto alloc_fail; - /* Query logins response DMA */ scsi_id->query_logins_response = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_response), @@ -915,7 +883,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) if (!scsi_id->query_logins_response) goto alloc_fail; - /* Reconnect ORB DMA */ scsi_id->reconnect_orb = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_reconnect_orb), @@ -923,7 +890,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) if (!scsi_id->reconnect_orb) goto alloc_fail; - /* Logout ORB DMA */ scsi_id->logout_orb = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_logout_orb), @@ -931,7 +897,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) if (!scsi_id->logout_orb) goto alloc_fail; - /* Login ORB DMA */ scsi_id->login_orb = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_login_orb), @@ -939,51 +904,28 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) if (!scsi_id->login_orb) goto alloc_fail; - /* - * Create our command orb pool - */ if (sbp2util_create_command_orb_pool(scsi_id)) { SBP2_ERR("sbp2util_create_command_orb_pool failed!"); sbp2_remove_device(scsi_id); return -ENOMEM; } - /* Schedule a timeout here. The reason is that we may be so close - * to a bus reset, that the device is not available for logins. - * This can happen when the bus reset is caused by the host - * connected to the sbp2 device being removed. That host would - * have a certain amount of time to relogin before the sbp2 device - * allows someone else to login instead. One second makes sense. */ + /* Wait a second before trying to log in. Previously logged in + * initiators need a chance to reconnect. */ if (msleep_interruptible(1000)) { sbp2_remove_device(scsi_id); return -EINTR; } - /* - * Login to the sbp-2 device - */ if (sbp2_login_device(scsi_id)) { - /* Login failed, just remove the device. */ sbp2_remove_device(scsi_id); return -EBUSY; } - /* - * Set max retries to something large on the device - */ sbp2_set_busy_timeout(scsi_id); - - /* - * Do a SBP-2 fetch agent reset - */ sbp2_agent_reset(scsi_id, 1); - - /* - * Get the max speed and packet size that we can use - */ sbp2_max_speed_and_size(scsi_id); - /* Add this device to the scsi layer now */ error = scsi_add_device(scsi_id->scsi_host, 0, scsi_id->ud->id, 0); if (error) { SBP2_ERR("scsi_add_device failed"); @@ -1000,9 +942,6 @@ alloc_fail: return -ENOMEM; } -/* - * This function removes an sbp2 device from the sbp2scsi_host_info struct. - */ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) { struct sbp2scsi_host_info *hi; @@ -1012,7 +951,6 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) hi = scsi_id->hi; - /* This will remove our scsi device aswell */ if (scsi_id->scsi_host) { scsi_remove_host(scsi_id->scsi_host); scsi_host_put(scsi_id->scsi_host); @@ -1067,33 +1005,25 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) #ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA /* - * This function deals with physical dma write requests (for adapters that do not support - * physical dma in hardware). Mostly just here for debugging... + * Deal with write requests on adapters which do not support physical DMA or + * have it switched off. */ static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data, u64 addr, size_t length, u16 flags) { - - /* - * Manually put the data in the right place. - */ memcpy(bus_to_virt((u32) addr), data, length); return RCODE_COMPLETE; } /* - * This function deals with physical dma read requests (for adapters that do not support - * physical dma in hardware). Mostly just here for debugging... + * Deal with read requests on adapters which do not support physical DMA or + * have it switched off. */ static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, quadlet_t *data, u64 addr, size_t length, u16 flags) { - - /* - * Grab data from memory and send a read response. - */ memcpy(data, bus_to_virt((u32) addr), length); return RCODE_COMPLETE; } @@ -1103,10 +1033,6 @@ static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, * SBP-2 protocol related section **************************************/ -/* - * This function queries the device for the maximum concurrent logins it - * supports. - */ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) { struct sbp2scsi_host_info *hi = scsi_id->hi; @@ -1172,10 +1098,6 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) return 0; } -/* - * This function is called in order to login to a particular SBP-2 device, - * after a bus reset. - */ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) { struct sbp2scsi_host_info *hi = scsi_id->hi; @@ -1191,17 +1113,18 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) } } - /* Set-up login ORB, assume no password */ + /* assume no password */ scsi_id->login_orb->password_hi = 0; scsi_id->login_orb->password_lo = 0; scsi_id->login_orb->login_response_lo = scsi_id->login_response_dma; scsi_id->login_orb->login_response_hi = ORB_SET_NODE_ID(hi->host->node_id); - scsi_id->login_orb->lun_misc = ORB_SET_FUNCTION(SBP2_LOGIN_REQUEST); - scsi_id->login_orb->lun_misc |= ORB_SET_RECONNECT(0); /* One second reconnect time */ - scsi_id->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(exclusive_login); /* Exclusive access to device */ - scsi_id->login_orb->lun_misc |= ORB_SET_NOTIFY(1); /* Notify us of login complete */ + + /* one second reconnect time */ + scsi_id->login_orb->lun_misc |= ORB_SET_RECONNECT(0); + scsi_id->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(exclusive_login); + scsi_id->login_orb->lun_misc |= ORB_SET_NOTIFY(1); scsi_id->login_orb->lun_misc |= ORB_SET_LUN(scsi_id->sbp2_lun); scsi_id->login_orb->passwd_resp_lengths = @@ -1222,17 +1145,13 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) hpsb_node_write(scsi_id->ne, scsi_id->sbp2_management_agent_addr, data, 8); - /* - * Wait for login status (up to 20 seconds)... - */ + /* wait up to 20 seconds for login status */ if (sbp2util_access_timeout(scsi_id, 20*HZ)) { SBP2_ERR("Error logging into SBP-2 device - timed out"); return -EIO; } - /* - * Sanity. Make sure status returned matches login orb. - */ + /* make sure that the returned status matches the login ORB */ if (scsi_id->status_block.ORB_offset_lo != scsi_id->login_orb_dma) { SBP2_ERR("Error logging into SBP-2 device - timed out"); return -EIO; @@ -1243,15 +1162,7 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) return -EIO; } - /* - * Byte swap the login response, for use when reconnecting or - * logging out. - */ sbp2util_cpu_to_be32_buffer(scsi_id->login_response, sizeof(struct sbp2_login_response)); - - /* - * Grab our command block agent address from the login response. - */ scsi_id->sbp2_command_block_agent_addr = ((u64)scsi_id->login_response->command_block_agent_hi) << 32; scsi_id->sbp2_command_block_agent_addr |= ((u64)scsi_id->login_response->command_block_agent_lo); @@ -1261,19 +1172,12 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) return 0; } -/* - * This function is called in order to logout from a particular SBP-2 - * device, usually called during driver unload. - */ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) { struct sbp2scsi_host_info *hi = scsi_id->hi; quadlet_t data[2]; int error; - /* - * Set-up logout ORB - */ scsi_id->logout_orb->reserved1 = 0x0; scsi_id->logout_orb->reserved2 = 0x0; scsi_id->logout_orb->reserved3 = 0x0; @@ -1281,8 +1185,6 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) scsi_id->logout_orb->login_ID_misc = ORB_SET_FUNCTION(SBP2_LOGOUT_REQUEST); scsi_id->logout_orb->login_ID_misc |= ORB_SET_LOGIN_ID(scsi_id->login_response->length_login_ID); - - /* Notify us when complete */ scsi_id->logout_orb->login_ID_misc |= ORB_SET_NOTIFY(1); scsi_id->logout_orb->reserved5 = 0x0; @@ -1291,14 +1193,8 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) scsi_id->logout_orb->status_fifo_lo = ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr); - /* - * Byte swap ORB if necessary - */ sbp2util_cpu_to_be32_buffer(scsi_id->logout_orb, sizeof(struct sbp2_logout_orb)); - /* - * Ok, let's write to the target's management agent register - */ data[0] = ORB_SET_NODE_ID(hi->host->node_id); data[1] = scsi_id->logout_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); @@ -1308,7 +1204,7 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) if (error) return error; - /* Wait for device to logout...1 second. */ + /* wait up to 1 second for the device to complete logout */ if (sbp2util_access_timeout(scsi_id, HZ)) return -EIO; @@ -1316,19 +1212,12 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) return 0; } -/* - * This function is called in order to reconnect to a particular SBP-2 - * device, after a bus reset. - */ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) { struct sbp2scsi_host_info *hi = scsi_id->hi; quadlet_t data[2]; int error; - /* - * Set-up reconnect ORB - */ scsi_id->reconnect_orb->reserved1 = 0x0; scsi_id->reconnect_orb->reserved2 = 0x0; scsi_id->reconnect_orb->reserved3 = 0x0; @@ -1337,8 +1226,6 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) scsi_id->reconnect_orb->login_ID_misc = ORB_SET_FUNCTION(SBP2_RECONNECT_REQUEST); scsi_id->reconnect_orb->login_ID_misc |= ORB_SET_LOGIN_ID(scsi_id->login_response->length_login_ID); - - /* Notify us when complete */ scsi_id->reconnect_orb->login_ID_misc |= ORB_SET_NOTIFY(1); scsi_id->reconnect_orb->reserved5 = 0x0; @@ -1347,9 +1234,6 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) scsi_id->reconnect_orb->status_fifo_lo = ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr); - /* - * Byte swap ORB if necessary - */ sbp2util_cpu_to_be32_buffer(scsi_id->reconnect_orb, sizeof(struct sbp2_reconnect_orb)); data[0] = ORB_SET_NODE_ID(hi->host->node_id); @@ -1361,17 +1245,13 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) if (error) return error; - /* - * Wait for reconnect status (up to 1 second)... - */ + /* wait up to 1 second for reconnect status */ if (sbp2util_access_timeout(scsi_id, HZ)) { SBP2_ERR("Error reconnecting to SBP-2 device - timed out"); return -EIO; } - /* - * Sanity. Make sure status returned matches reconnect orb. - */ + /* make sure that the returned status matches the reconnect ORB */ if (scsi_id->status_block.ORB_offset_lo != scsi_id->reconnect_orb_dma) { SBP2_ERR("Error reconnecting to SBP-2 device - timed out"); return -EIO; @@ -1387,8 +1267,8 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) } /* - * This function is called in order to set the busy timeout (number of - * retries to attempt) on the sbp2 device. + * Set the target node's Single Phase Retry limit. Affects the target's retry + * behaviour if our node is too busy to accept requests. */ static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id) { @@ -1400,11 +1280,6 @@ static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id) return 0; } -/* - * This function is called to parse sbp2 device's config rom unit - * directory. Used to determine things like sbp2 management agent offset, - * and command set used (SCSI or RBC). - */ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, struct unit_directory *ud) { @@ -1422,12 +1297,10 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, unit_characteristics = 0x0; firmware_revision = 0x0; - /* Handle different fields in the unit directory, based on keys */ csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) { switch (kv->key.id) { case CSR1212_KV_ID_DEPENDENT_INFO: if (kv->key.type == CSR1212_KV_TYPE_CSR_OFFSET) - /* Save off the management agent address */ management_agent_addr = CSR1212_REGISTER_SPACE_BASE + (kv->value.csr_offset << 2); @@ -1438,29 +1311,27 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, break; case SBP2_COMMAND_SET_SPEC_ID_KEY: - /* Command spec organization */ command_set_spec_id = kv->value.immediate; break; case SBP2_COMMAND_SET_KEY: - /* Command set used by sbp2 device */ command_set = kv->value.immediate; break; case SBP2_UNIT_CHARACTERISTICS_KEY: - /* - * Unit characterisitcs (orb related stuff - * that I'm not yet paying attention to) - */ + /* FIXME: This is ignored so far. + * See SBP-2 clause 7.4.8. */ unit_characteristics = kv->value.immediate; break; case SBP2_FIRMWARE_REVISION_KEY: - /* Firmware revision */ firmware_revision = kv->value.immediate; break; default: + /* FIXME: Check for SBP2_DEVICE_TYPE_AND_LUN_KEY. + * Its "ordered" bit has consequences for command ORB + * list handling. See SBP-2 clauses 4.6, 7.4.11, 10.2 */ break; } } @@ -1536,7 +1407,6 @@ static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id) scsi_id->speed_code = hi->host->speed[NODEID_TO_NODE(scsi_id->ne->nodeid)]; - /* Bump down our speed if the user requested it */ if (scsi_id->speed_code > max_speed) { scsi_id->speed_code = max_speed; SBP2_INFO("Reducing speed to %s", hpsb_speedto_str[max_speed]); @@ -1563,9 +1433,6 @@ static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id) return 0; } -/* - * This function is called in order to perform a SBP-2 agent reset. - */ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) { quadlet_t data; @@ -1590,9 +1457,7 @@ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) return -EIO; } - /* - * Need to make sure orb pointer is written on next command - */ + /* make sure that the ORB_POINTER is written on next command */ spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); scsi_id->last_orb = NULL; spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); @@ -1612,7 +1477,7 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id); orb->misc |= ORB_SET_DIRECTION(orb_direction); - /* Special case if only one element (and less than 64KB in size) */ + /* special case if only one element (and less than 64KB in size) */ if ((scsi_use_sg == 1) && (sgpnt[0].length <= SBP2_MAX_SG_ELEMENT_LENGTH)) { @@ -1642,10 +1507,8 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1); orb->data_descriptor_lo = command->sge_dma; - /* - * Loop through and fill out our sbp-2 page tables - * (and split up anything too large) - */ + /* loop through and fill out our SBP-2 page tables + * (and split up anything too large) */ for (i = 0, sg_count = 0 ; i < count; i++, sgpnt++) { sg_len = sg_dma_len(sgpnt); sg_addr = sg_dma_address(sgpnt); @@ -1665,10 +1528,8 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, } } - /* Number of page table (s/g) elements */ orb->misc |= ORB_SET_DATA_SIZE(sg_count); - /* Byte swap page tables if necessary */ sbp2util_cpu_to_be32_buffer(sg_element, (sizeof(struct sbp2_unrestricted_page_table)) * sg_count); @@ -1692,34 +1553,25 @@ static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id); orb->misc |= ORB_SET_DIRECTION(orb_direction); - /* - * Handle case where we get a command w/o s/g enabled (but - * check for transfers larger than 64K) - */ + /* handle case where we get a command w/o s/g enabled + * (but check for transfers larger than 64K) */ if (scsi_request_bufflen <= SBP2_MAX_SG_ELEMENT_LENGTH) { orb->data_descriptor_lo = command->cmd_dma; orb->misc |= ORB_SET_DATA_SIZE(scsi_request_bufflen); } else { + /* The buffer is too large. Turn this into page tables. */ + struct sbp2_unrestricted_page_table *sg_element = &command->scatter_gather_element[0]; u32 sg_count, sg_len; dma_addr_t sg_addr; - /* - * Need to turn this into page tables, since the - * buffer is too large. - */ orb->data_descriptor_lo = command->sge_dma; - - /* Use page tables (s/g) */ orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1); - /* - * fill out our sbp-2 page tables (and split up - * the large buffer) - */ + /* fill out our SBP-2 page tables; split up the large buffer */ sg_count = 0; sg_len = scsi_request_bufflen; sg_addr = command->cmd_dma; @@ -1738,20 +1590,14 @@ static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, sg_count++; } - /* Number of page table (s/g) elements */ orb->misc |= ORB_SET_DATA_SIZE(sg_count); - /* Byte swap page tables if necessary */ sbp2util_cpu_to_be32_buffer(sg_element, (sizeof(struct sbp2_unrestricted_page_table)) * sg_count); } } -/* - * This function is called to create the actual command orb and s/g list - * out of the scsi command itself. - */ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, struct sbp2_command_info *command, unchar *scsi_cmd, @@ -1766,7 +1612,7 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, u32 orb_direction; /* - * Set-up our command ORB.. + * Set-up our command ORB. * * NOTE: We're doing unrestricted page tables (s/g), as this is * best performance (at least with the devices I have). This means @@ -1777,7 +1623,7 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, command_orb->next_ORB_lo = 0x0; command_orb->misc = ORB_SET_MAX_PAYLOAD(scsi_id->max_payload_size); command_orb->misc |= ORB_SET_SPEED(scsi_id->speed_code); - command_orb->misc |= ORB_SET_NOTIFY(1); /* Notify us when complete */ + command_orb->misc |= ORB_SET_NOTIFY(1); if (dma_dir == DMA_NONE) orb_direction = ORB_DIRECTION_NO_DATA_TRANSFER; @@ -1790,7 +1636,7 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, orb_direction = ORB_DIRECTION_NO_DATA_TRANSFER; } - /* Set-up our pagetable stuff */ + /* set up our page table stuff */ if (orb_direction == ORB_DIRECTION_NO_DATA_TRANSFER) { command_orb->data_descriptor_hi = 0x0; command_orb->data_descriptor_lo = 0x0; @@ -1803,17 +1649,12 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, orb_direction, scsi_request_bufflen, scsi_request_buffer, dma_dir); - /* Byte swap command ORB if necessary */ sbp2util_cpu_to_be32_buffer(command_orb, sizeof(struct sbp2_command_orb)); - /* Put our scsi command in the command ORB */ memset(command_orb->cdb, 0, 12); memcpy(command_orb->cdb, scsi_cmd, COMMAND_SIZE(*scsi_cmd)); } -/* - * This function is called in order to begin a regular SBP-2 command. - */ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, struct sbp2_command_info *command) { @@ -1832,9 +1673,8 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, pci_dma_sync_single_for_device(hi->host->pdev, command->sge_dma, sizeof(command->scatter_gather_element), PCI_DMA_BIDIRECTIONAL); - /* - * Check to see if there are any previous orbs to use - */ + + /* check to see if there are any previous orbs to use */ spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); last_orb = scsi_id->last_orb; last_orb_dma = scsi_id->last_orb_dma; @@ -1892,9 +1732,6 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, } } -/* - * This function is called in order to begin a regular SBP-2 command. - */ static int sbp2_send_command(struct scsi_id_instance_data *scsi_id, struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) @@ -1903,23 +1740,13 @@ static int sbp2_send_command(struct scsi_id_instance_data *scsi_id, unsigned int request_bufflen = SCpnt->request_bufflen; struct sbp2_command_info *command; - /* - * Allocate a command orb and s/g structure - */ command = sbp2util_allocate_command_orb(scsi_id, SCpnt, done); if (!command) return -EIO; - /* - * Now actually fill in the comamnd orb and sbp2 s/g list - */ sbp2_create_command_orb(scsi_id, command, cmd, SCpnt->use_sg, request_bufflen, SCpnt->request_buffer, SCpnt->sc_data_direction); - - /* - * Link up the orb, and ring the doorbell if needed - */ sbp2_link_orb_command(scsi_id, command); return 0; @@ -1930,9 +1757,7 @@ static int sbp2_send_command(struct scsi_id_instance_data *scsi_id, */ static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense_data) { - /* - * Ok, it's pretty ugly... ;-) - */ + /* OK, it's pretty ugly... ;-) */ sense_data[0] = 0x70; sense_data[1] = 0x0; sense_data[2] = sbp2_status[9]; @@ -1950,12 +1775,9 @@ static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense sense_data[14] = sbp2_status[20]; sense_data[15] = sbp2_status[21]; - return sbp2_status[8] & 0x3f; /* return scsi status */ + return sbp2_status[8] & 0x3f; } -/* - * This function deals with status writes from the SBP-2 device - */ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data, u64 addr, size_t length, u16 fl) @@ -1981,10 +1803,8 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, SBP2_ERR("host info is NULL - this is bad!"); return RCODE_ADDRESS_ERROR; } - /* - * Find our scsi_id structure by looking at the status fifo address - * written to by the sbp2 device. - */ + + /* Find the unit which wrote the status. */ list_for_each_entry(scsi_id_tmp, &hi->scsi_ids, scsi_list) { if (scsi_id_tmp->ne->nodeid == nodeid && scsi_id_tmp->status_fifo_addr == addr) { @@ -1997,20 +1817,16 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, return RCODE_ADDRESS_ERROR; } - /* - * Put response into scsi_id status fifo buffer. The first two bytes + /* Put response into scsi_id status fifo buffer. The first two bytes * come in big endian bit order. Often the target writes only a * truncated status block, minimally the first two quadlets. The rest - * is implied to be zeros. - */ + * is implied to be zeros. */ sb = &scsi_id->status_block; memset(sb->command_set_dependent, 0, sizeof(sb->command_set_dependent)); memcpy(sb, data, length); sbp2util_be32_to_cpu_buffer(sb, 8); - /* - * Ignore unsolicited status. Handle command ORB status. - */ + /* Ignore unsolicited status. Handle command ORB status. */ if (unlikely(STATUS_GET_SRC(sb->ORB_offset_hi_misc) == 2)) command = NULL; else @@ -2023,10 +1839,7 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, pci_dma_sync_single_for_cpu(hi->host->pdev, command->sge_dma, sizeof(command->scatter_gather_element), PCI_DMA_BIDIRECTIONAL); - /* - * Matched status with command, now grab scsi command pointers - * and check status. - */ + /* Grab SCSI command pointers and check status. */ /* * FIXME: If the src field in the status is 1, the ORB DMA must * not be reused until status for a subsequent ORB is received. @@ -2048,37 +1861,28 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, SBP2_SCSI_STATUS_BUSY : SBP2_SCSI_STATUS_COMMAND_TERMINATED; } - /* - * See if the target stored any scsi status information. - */ + if (STATUS_GET_LEN(h) > 1) scsi_status = sbp2_status_to_sense_data( (unchar *)sb, SCpnt->sense_buffer); - /* - * Check to see if the dead bit is set. If so, we'll - * have to initiate a fetch agent reset. - */ + if (STATUS_TEST_DEAD(h)) sbp2_agent_reset(scsi_id, 0); } - /* - * Check here to see if there are no commands in-use. If there + /* Check here to see if there are no commands in-use. If there * are none, we know that the fetch agent left the active state * _and_ that we did not reactivate it yet. Therefore clear * last_orb so that next time we write directly to the * ORB_POINTER register. That way the fetch agent does not need - * to refetch the next_ORB. - */ + * to refetch the next_ORB. */ spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); if (list_empty(&scsi_id->sbp2_command_orb_inuse)) scsi_id->last_orb = NULL; spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); } else { - /* - * It's probably a login/logout/reconnect status. - */ + /* It's probably status after a management request. */ if ((sb->ORB_offset_lo == scsi_id->reconnect_orb_dma) || (sb->ORB_offset_lo == scsi_id->login_orb_dma) || (sb->ORB_offset_lo == scsi_id->query_logins_orb_dma) || @@ -2098,10 +1902,6 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, * SCSI interface related section **************************************/ -/* - * This routine is the main request entry routine for doing I/O. It is - * called from the scsi stack directly. - */ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) { @@ -2120,17 +1920,13 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, goto done; } - /* - * Until we handle multiple luns, just return selection time-out - * to any IO directed at non-zero LUNs - */ + /* Multiple units are currently represented to the SCSI core as separate + * targets, not as one target with multiple LUs. Therefore return + * selection time-out to any IO directed at non-zero LUNs. */ if (SCpnt->device->lun) goto done; - /* - * Check for request sense command, and handle it here - * (autorequest sense) - */ + /* handle the request sense command here (auto-request sense) */ if (SCpnt->cmnd[0] == REQUEST_SENSE) { memcpy(SCpnt->request_buffer, SCpnt->sense_buffer, SCpnt->request_bufflen); memset(SCpnt->sense_buffer, 0, sizeof(SCpnt->sense_buffer)); @@ -2138,28 +1934,20 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, return 0; } - /* - * Check to see if we are in the middle of a bus reset. - */ if (!hpsb_node_entry_valid(scsi_id->ne)) { SBP2_ERR("Bus reset in progress - rejecting command"); result = DID_BUS_BUSY << 16; goto done; } - /* - * Bidirectional commands are not yet implemented, - * and unknown transfer direction not handled. - */ + /* Bidirectional commands are not yet implemented, + * and unknown transfer direction not handled. */ if (SCpnt->sc_data_direction == DMA_BIDIRECTIONAL) { SBP2_ERR("Cannot handle DMA_BIDIRECTIONAL - rejecting command"); result = DID_ERROR << 16; goto done; } - /* - * Try and send our SCSI command - */ if (sbp2_send_command(scsi_id, SCpnt, done)) { SBP2_ERR("Error sending SCSI command"); sbp2scsi_complete_command(scsi_id, SBP2_SCSI_STATUS_SELECTION_TIMEOUT, @@ -2173,10 +1961,6 @@ done: return 0; } -/* - * This function is called in order to complete all outstanding SBP-2 - * commands (in case of resets, etc.). - */ static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id, u32 status) { @@ -2207,25 +1991,17 @@ static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id } /* - * This function is called in order to complete a regular SBP-2 command. - * - * This can be called in interrupt context. + * Complete a regular SCSI command. Can be called in atomic context. */ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, u32 scsi_status, struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) { - /* - * Sanity - */ if (!SCpnt) { SBP2_ERR("SCpnt is NULL"); return; } - /* - * Switch on scsi status - */ switch (scsi_status) { case SBP2_SCSI_STATUS_GOOD: SCpnt->result = DID_OK << 16; @@ -2259,19 +2035,15 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, SCpnt->result = DID_ERROR << 16; } - /* - * If a bus reset is in progress and there was an error, complete - * the command as busy so that it will get retried. - */ + /* If a bus reset is in progress and there was an error, complete + * the command as busy so that it will get retried. */ if (!hpsb_node_entry_valid(scsi_id->ne) && (scsi_status != SBP2_SCSI_STATUS_GOOD)) { SBP2_ERR("Completing command with busy (bus reset)"); SCpnt->result = DID_BUS_BUSY << 16; } - /* - * Tell scsi stack that we're done with this command - */ + /* Tell the SCSI stack that we're done with this command. */ done(SCpnt); } @@ -2311,8 +2083,8 @@ static void sbp2scsi_slave_destroy(struct scsi_device *sdev) } /* - * Called by scsi stack when something has really gone wrong. Usually - * called when a command has timed-out for some reason. + * Called by scsi stack when something has really gone wrong. + * Usually called when a command has timed-out for some reason. */ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) { @@ -2401,7 +2173,6 @@ static int sbp2_module_init(void) { int ret; - /* Module load debug option to force one command at a time (serializing I/O) */ if (serialize_io) { scsi_driver_template.can_queue = 1; scsi_driver_template.cmd_per_lun = 1; @@ -2412,16 +2183,13 @@ static int sbp2_module_init(void) max_sectors = 128 * 1024 / 512; scsi_driver_template.max_sectors = max_sectors; - /* Register our high level driver with 1394 stack */ hpsb_register_highlevel(&sbp2_highlevel); - ret = hpsb_register_protocol(&sbp2_driver); if (ret) { SBP2_ERR("Failed to register protocol"); hpsb_unregister_highlevel(&sbp2_highlevel); return ret; } - return 0; } diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index 5483b45..d1dbc0d 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -25,7 +25,7 @@ #define SBP2_DEVICE_NAME "sbp2" /* - * SBP2 specific structures and defines + * SBP-2 specific definitions */ #define ORB_DIRECTION_WRITE_TO_MEDIA 0x0 @@ -185,8 +185,9 @@ struct sbp2_status_block { u8 command_set_dependent[24]; } __attribute__((packed)); + /* - * Miscellaneous SBP2 related config rom defines + * SBP2 related configuration ROM definitions */ #define SBP2_UNIT_DIRECTORY_OFFSET_KEY 0xd1 @@ -207,19 +208,17 @@ struct sbp2_status_block { #define SBP2_UNSOLICITED_STATUS_VALUE 0xf #define SBP2_BUSY_TIMEOUT_ADDRESS 0xfffff0000210ULL +/* biggest possible value for Single Phase Retry count is 0xf */ #define SBP2_BUSY_TIMEOUT_VALUE 0xf #define SBP2_AGENT_RESET_DATA 0xf -/* - * Unit spec id and sw version entry for SBP-2 devices - */ - #define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e #define SBP2_SW_VERSION_ENTRY 0x00010483 + /* - * SCSI specific stuff + * SCSI specific definitions */ #define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 @@ -237,18 +236,19 @@ struct sbp2_status_block { #define SBP2_SCSI_STATUS_COMMAND_TERMINATED 0x22 #define SBP2_SCSI_STATUS_SELECTION_TIMEOUT 0xff -/* This is the two dma types we use for cmd_dma below */ + +/* + * Representations of commands and devices + */ + enum cmd_dma_types { CMD_DMA_NONE, CMD_DMA_PAGE, CMD_DMA_SINGLE }; -/* - * Encapsulates all the info necessary for an outstanding command. - */ +/* Per SCSI command */ struct sbp2_command_info { - struct list_head list; struct sbp2_command_orb command_orb ____cacheline_aligned; dma_addr_t command_orb_dma ____cacheline_aligned; @@ -263,18 +263,17 @@ struct sbp2_command_info { enum cmd_dma_types dma_type; unsigned long dma_size; int dma_dir; - }; -struct sbp2scsi_host_info; +/* Per FireWire host */ +struct sbp2scsi_host_info { + struct hpsb_host *host; + struct list_head scsi_ids; +}; -/* - * Information needed on a per scsi id basis (one for each sbp2 device) - */ +/* Per logical unit */ struct scsi_id_instance_data { - /* - * Various sbp2 specific structures - */ + /* Operation request blocks */ struct sbp2_command_orb *last_orb; dma_addr_t last_orb_dma; struct sbp2_login_orb *login_orb; @@ -291,57 +290,49 @@ struct scsi_id_instance_data { dma_addr_t logout_orb_dma; struct sbp2_status_block status_block; - /* - * Stuff we need to know about the sbp2 device itself - */ + /* How to talk to the unit */ u64 sbp2_management_agent_addr; u64 sbp2_command_block_agent_addr; u32 speed_code; u32 max_payload_size; - /* - * Values pulled from the device's unit directory - */ + /* Pulled from the device's unit directory */ u32 sbp2_command_set_spec_id; u32 sbp2_command_set; u32 sbp2_unit_characteristics; u32 sbp2_lun; u32 sbp2_firmware_revision; - /* - * Address for the device to write status blocks to - */ + /* Address for the unit to write status blocks to */ u64 status_fifo_addr; - /* - * Waitqueue flag for logins, reconnects, logouts, query logins - */ + /* Waitqueue flag for logins, reconnects, logouts, query logins */ int access_complete:1; - /* - * Pool of command orbs, so we can have more than overlapped command per id - */ + /* Pool of command ORBs for this logical unit */ spinlock_t sbp2_command_orb_lock; struct list_head sbp2_command_orb_inuse; struct list_head sbp2_command_orb_completed; + /* Backlink to FireWire host; list of units attached to the host */ + struct sbp2scsi_host_info *hi; struct list_head scsi_list; - /* Node entry, as retrieved from NodeMgr entries */ + /* IEEE 1394 core's device representations */ struct node_entry *ne; struct unit_directory *ud; - /* A backlink to our host_info */ - struct sbp2scsi_host_info *hi; - - /* SCSI related pointers */ + /* SCSI core's device representations */ struct scsi_device *sdev; struct Scsi_Host *scsi_host; /* Device specific workarounds/brokeness */ unsigned workarounds; + /* Connection state */ atomic_t state; + + /* For deferred requests to the fetch agent */ struct work_struct protocol_work; }; @@ -352,13 +343,8 @@ enum sbp2lu_state_types { SBP2LU_STATE_IN_SHUTDOWN /* when sbp2_remove was called */ }; -/* Sbp2 host data structure (one per IEEE1394 host) */ -struct sbp2scsi_host_info { - struct hpsb_host *host; /* IEEE1394 host */ - struct list_head scsi_ids; /* List of scsi ids on this host */ -}; - -/* Flags for detected oddities and brokeness */ +/* For use in scsi_id_instance_data.workarounds and in the corresponding + * module load parameter */ #define SBP2_WORKAROUND_128K_MAX_TRANS 0x1 #define SBP2_WORKAROUND_INQUIRY_36 0x2 #define SBP2_WORKAROUND_MODE_SENSE_8 0x4 -- cgit v1.1 From 5796aa7b11a6ba9d28a523fc82dddbc96c1a175e Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: some conditions in queue_command are unlikely Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 625f1eb..96a743d 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -1910,12 +1910,12 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, struct sbp2scsi_host_info *hi; int result = DID_NO_CONNECT << 16; - if (!sbp2util_node_is_available(scsi_id)) + if (unlikely(!sbp2util_node_is_available(scsi_id))) goto done; hi = scsi_id->hi; - if (!hi) { + if (unlikely(!hi)) { SBP2_ERR("sbp2scsi_host_info is NULL - this is bad!"); goto done; } @@ -1923,7 +1923,7 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, /* Multiple units are currently represented to the SCSI core as separate * targets, not as one target with multiple LUs. Therefore return * selection time-out to any IO directed at non-zero LUNs. */ - if (SCpnt->device->lun) + if (unlikely(SCpnt->device->lun)) goto done; /* handle the request sense command here (auto-request sense) */ @@ -1934,7 +1934,7 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, return 0; } - if (!hpsb_node_entry_valid(scsi_id->ne)) { + if (unlikely(!hpsb_node_entry_valid(scsi_id->ne))) { SBP2_ERR("Bus reset in progress - rejecting command"); result = DID_BUS_BUSY << 16; goto done; @@ -1942,7 +1942,7 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, /* Bidirectional commands are not yet implemented, * and unknown transfer direction not handled. */ - if (SCpnt->sc_data_direction == DMA_BIDIRECTIONAL) { + if (unlikely(SCpnt->sc_data_direction == DMA_BIDIRECTIONAL)) { SBP2_ERR("Cannot handle DMA_BIDIRECTIONAL - rejecting command"); result = DID_ERROR << 16; goto done; -- cgit v1.1 From ca0c7453995d3696034435820522e2a60bd59bfc Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: clean up sbp2_ namespace Prepend sbp2*_ to anything globally defined in sbp2.c except for some macros. Strip sbp2_ from names of struct members. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 237 ++++++++++++++++++++++++------------------------ drivers/ieee1394/sbp2.h | 28 +++--- 2 files changed, 132 insertions(+), 133 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 96a743d..6737af2 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -98,8 +98,8 @@ * (probably due to PCI latency/throughput issues with the part). You can * bump down the speed if you are running into problems. */ -static int max_speed = IEEE1394_SPEED_MAX; -module_param(max_speed, int, 0644); +static int sbp2_max_speed = IEEE1394_SPEED_MAX; +module_param_named(max_speed, sbp2_max_speed, int, 0644); MODULE_PARM_DESC(max_speed, "Force max speed (3 = 800mb, 2 = 400mb, 1 = 200mb, 0 = 100mb)"); /* @@ -109,9 +109,10 @@ MODULE_PARM_DESC(max_speed, "Force max speed (3 = 800mb, 2 = 400mb, 1 = 200mb, 0 * * TODO: Make this configurable per device. */ -static int serialize_io = 1; -module_param(serialize_io, int, 0444); -MODULE_PARM_DESC(serialize_io, "Serialize I/O coming from scsi drivers (default = 1, faster = 0)"); +static int sbp2_serialize_io = 1; +module_param_named(serialize_io, sbp2_serialize_io, int, 0444); +MODULE_PARM_DESC(serialize_io, "Serialize I/O coming from scsi drivers " + "(default = 1, faster = 0)"); /* * Bump up max_sectors if you'd like to support very large sized @@ -121,10 +122,10 @@ MODULE_PARM_DESC(serialize_io, "Serialize I/O coming from scsi drivers (default * the Oxsemi sbp2 chipsets have no problems supporting very large * transfer sizes. */ -static int max_sectors = SBP2_MAX_SECTORS; -module_param(max_sectors, int, 0444); -MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = " - __stringify(SBP2_MAX_SECTORS) ")"); +static int sbp2_max_sectors = SBP2_MAX_SECTORS; +module_param_named(max_sectors, sbp2_max_sectors, int, 0444); +MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported " + "(default = " __stringify(SBP2_MAX_SECTORS) ")"); /* * Exclusive login to sbp2 device? In most cases, the sbp2 driver should @@ -139,9 +140,10 @@ MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = " * concurrent logins. Depending on firmware, four or two concurrent logins * are possible on OXFW911 and newer Oxsemi bridges. */ -static int exclusive_login = 1; -module_param(exclusive_login, int, 0644); -MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device (default = 1)"); +static int sbp2_exclusive_login = 1; +module_param_named(exclusive_login, sbp2_exclusive_login, int, 0644); +MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device " + "(default = 1)"); /* * If any of the following workarounds is required for your device to work, @@ -279,7 +281,7 @@ static struct device_attribute *sbp2_sysfs_sdev_attrs[] = { NULL }; -static struct scsi_host_template scsi_driver_template = { +static struct scsi_host_template sbp2_shost_template = { .module = THIS_MODULE, .name = "SBP-2 IEEE-1394", .proc_name = SBP2_DEVICE_NAME, @@ -388,7 +390,7 @@ static inline void sbp2util_cpu_to_be32_buffer(void *buffer, int length) #define sbp2util_cpu_to_be32_buffer(x,y) do {} while (0) #endif -static DECLARE_WAIT_QUEUE_HEAD(access_wq); +static DECLARE_WAIT_QUEUE_HEAD(sbp2_access_wq); /* * Waits for completion of an SBP-2 access request. @@ -397,9 +399,10 @@ static DECLARE_WAIT_QUEUE_HEAD(access_wq); static int sbp2util_access_timeout(struct scsi_id_instance_data *scsi_id, int timeout) { - long leftover = wait_event_interruptible_timeout( - access_wq, scsi_id->access_complete, timeout); + long leftover; + leftover = wait_event_interruptible_timeout( + sbp2_access_wq, scsi_id->access_complete, timeout); scsi_id->access_complete = 0; return leftover <= 0; } @@ -449,7 +452,7 @@ static void sbp2util_notify_fetch_agent(struct scsi_id_instance_data *scsi_id, return; if (hpsb_node_write(scsi_id->ne, - scsi_id->sbp2_command_block_agent_addr + offset, + scsi_id->command_block_agent_addr + offset, data, len)) SBP2_ERR("sbp2util_notify_fetch_agent failed."); /* @@ -478,18 +481,18 @@ static void sbp2util_write_doorbell(struct work_struct *work) static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; int i; unsigned long flags, orbs; struct sbp2_command_info *command; - orbs = serialize_io ? 2 : SBP2_MAX_CMDS; + orbs = sbp2_serialize_io ? 2 : SBP2_MAX_CMDS; - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); for (i = 0; i < orbs; i++) { command = kzalloc(sizeof(*command), GFP_ATOMIC); if (!command) { - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); return -ENOMEM; } @@ -503,9 +506,9 @@ static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_i sizeof(command->scatter_gather_element), PCI_DMA_BIDIRECTIONAL); INIT_LIST_HEAD(&command->list); - list_add_tail(&command->list, &scsi_id->sbp2_command_orb_completed); + list_add_tail(&command->list, &scsi_id->cmd_orb_completed); } - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); return 0; } @@ -516,9 +519,9 @@ static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_ struct sbp2_command_info *command; unsigned long flags; - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); - if (!list_empty(&scsi_id->sbp2_command_orb_completed)) { - list_for_each_safe(lh, next, &scsi_id->sbp2_command_orb_completed) { + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); + if (!list_empty(&scsi_id->cmd_orb_completed)) { + list_for_each_safe(lh, next, &scsi_id->cmd_orb_completed) { command = list_entry(lh, struct sbp2_command_info, list); pci_unmap_single(host->pdev, command->command_orb_dma, sizeof(struct sbp2_command_orb), @@ -529,7 +532,7 @@ static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_ kfree(command); } } - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); return; } @@ -543,31 +546,31 @@ static struct sbp2_command_info *sbp2util_find_command_for_orb( struct sbp2_command_info *command; unsigned long flags; - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); - if (!list_empty(&scsi_id->sbp2_command_orb_inuse)) { - list_for_each_entry(command, &scsi_id->sbp2_command_orb_inuse, list) { + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); + if (!list_empty(&scsi_id->cmd_orb_inuse)) { + list_for_each_entry(command, &scsi_id->cmd_orb_inuse, list) { if (command->command_orb_dma == orb) { - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); return command; } } } - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); return NULL; } /* * Finds the sbp2_command for a given outstanding SCpnt. * Only looks at the in-use list. - * Must be called with scsi_id->sbp2_command_orb_lock held. + * Must be called with scsi_id->cmd_orb_lock held. */ static struct sbp2_command_info *sbp2util_find_command_for_SCpnt( struct scsi_id_instance_data *scsi_id, void *SCpnt) { struct sbp2_command_info *command; - if (!list_empty(&scsi_id->sbp2_command_orb_inuse)) - list_for_each_entry(command, &scsi_id->sbp2_command_orb_inuse, list) + if (!list_empty(&scsi_id->cmd_orb_inuse)) + list_for_each_entry(command, &scsi_id->cmd_orb_inuse, list) if (command->Current_SCpnt == SCpnt) return command; return NULL; @@ -582,18 +585,18 @@ static struct sbp2_command_info *sbp2util_allocate_command_orb( struct sbp2_command_info *command = NULL; unsigned long flags; - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); - if (!list_empty(&scsi_id->sbp2_command_orb_completed)) { - lh = scsi_id->sbp2_command_orb_completed.next; + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); + if (!list_empty(&scsi_id->cmd_orb_completed)) { + lh = scsi_id->cmd_orb_completed.next; list_del(lh); command = list_entry(lh, struct sbp2_command_info, list); command->Current_done = Current_done; command->Current_SCpnt = Current_SCpnt; - list_add_tail(&command->list, &scsi_id->sbp2_command_orb_inuse); + list_add_tail(&command->list, &scsi_id->cmd_orb_inuse); } else { SBP2_ERR("%s: no orbs available", __FUNCTION__); } - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); return command; } @@ -631,7 +634,7 @@ static void sbp2util_free_command_dma(struct sbp2_command_info *command) /* * This function moves a command to the completed orb list. - * Must be called with scsi_id->sbp2_command_orb_lock held. + * Must be called with scsi_id->cmd_orb_lock held. */ static void sbp2util_mark_command_completed( struct scsi_id_instance_data *scsi_id, @@ -639,7 +642,7 @@ static void sbp2util_mark_command_completed( { list_del(&command->list); sbp2util_free_command_dma(command); - list_add_tail(&command->list, &scsi_id->sbp2_command_orb_completed); + list_add_tail(&command->list, &scsi_id->cmd_orb_completed); } /* @@ -746,7 +749,7 @@ static int sbp2_update(struct unit_directory *ud) static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud) { - struct sbp2scsi_host_info *hi; + struct sbp2_fwhost_info *hi; struct Scsi_Host *scsi_host = NULL; struct scsi_id_instance_data *scsi_id = NULL; @@ -761,10 +764,10 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud scsi_id->speed_code = IEEE1394_SPEED_100; scsi_id->max_payload_size = sbp2_speedto_max_payload[IEEE1394_SPEED_100]; scsi_id->status_fifo_addr = CSR1212_INVALID_ADDR_SPACE; - INIT_LIST_HEAD(&scsi_id->sbp2_command_orb_inuse); - INIT_LIST_HEAD(&scsi_id->sbp2_command_orb_completed); + INIT_LIST_HEAD(&scsi_id->cmd_orb_inuse); + INIT_LIST_HEAD(&scsi_id->cmd_orb_completed); INIT_LIST_HEAD(&scsi_id->scsi_list); - spin_lock_init(&scsi_id->sbp2_command_orb_lock); + spin_lock_init(&scsi_id->cmd_orb_lock); atomic_set(&scsi_id->state, SBP2LU_STATE_RUNNING); INIT_WORK(&scsi_id->protocol_work, NULL); @@ -819,7 +822,7 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud goto failed_alloc; } - scsi_host = scsi_host_alloc(&scsi_driver_template, + scsi_host = scsi_host_alloc(&sbp2_shost_template, sizeof(unsigned long)); if (!scsi_host) { SBP2_ERR("failed to register scsi host"); @@ -843,7 +846,7 @@ failed_alloc: static void sbp2_host_reset(struct hpsb_host *host) { - struct sbp2scsi_host_info *hi; + struct sbp2_fwhost_info *hi; struct scsi_id_instance_data *scsi_id; hi = hpsb_get_hostinfo(&sbp2_highlevel, host); @@ -859,7 +862,7 @@ static void sbp2_host_reset(struct hpsb_host *host) static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; int error; scsi_id->login_response = @@ -944,7 +947,7 @@ alloc_fail: static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) { - struct sbp2scsi_host_info *hi; + struct sbp2_fwhost_info *hi; if (!scsi_id) return; @@ -1035,7 +1038,7 @@ static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; quadlet_t data[2]; int max_logins; int active_logins; @@ -1048,7 +1051,7 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) scsi_id->query_logins_orb->lun_misc = ORB_SET_FUNCTION(SBP2_QUERY_LOGINS_REQUEST); scsi_id->query_logins_orb->lun_misc |= ORB_SET_NOTIFY(1); - scsi_id->query_logins_orb->lun_misc |= ORB_SET_LUN(scsi_id->sbp2_lun); + scsi_id->query_logins_orb->lun_misc |= ORB_SET_LUN(scsi_id->lun); scsi_id->query_logins_orb->reserved_resp_length = ORB_SET_QUERY_LOGINS_RESP_LENGTH(sizeof(struct sbp2_query_logins_response)); @@ -1066,7 +1069,7 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) data[1] = scsi_id->query_logins_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - hpsb_node_write(scsi_id->ne, scsi_id->sbp2_management_agent_addr, data, 8); + hpsb_node_write(scsi_id->ne, scsi_id->management_agent_addr, data, 8); if (sbp2util_access_timeout(scsi_id, 2*HZ)) { SBP2_INFO("Error querying logins to SBP-2 device - timed out"); @@ -1100,17 +1103,15 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; quadlet_t data[2]; if (!scsi_id->login_orb) return -EIO; - if (!exclusive_login) { - if (sbp2_query_logins(scsi_id)) { - SBP2_INFO("Device does not support any more concurrent logins"); - return -EIO; - } + if (!sbp2_exclusive_login && sbp2_query_logins(scsi_id)) { + SBP2_INFO("Device does not support any more concurrent logins"); + return -EIO; } /* assume no password */ @@ -1123,9 +1124,9 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) /* one second reconnect time */ scsi_id->login_orb->lun_misc |= ORB_SET_RECONNECT(0); - scsi_id->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(exclusive_login); + scsi_id->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(sbp2_exclusive_login); scsi_id->login_orb->lun_misc |= ORB_SET_NOTIFY(1); - scsi_id->login_orb->lun_misc |= ORB_SET_LUN(scsi_id->sbp2_lun); + scsi_id->login_orb->lun_misc |= ORB_SET_LUN(scsi_id->lun); scsi_id->login_orb->passwd_resp_lengths = ORB_SET_LOGIN_RESP_LENGTH(sizeof(struct sbp2_login_response)); @@ -1143,7 +1144,7 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) data[1] = scsi_id->login_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - hpsb_node_write(scsi_id->ne, scsi_id->sbp2_management_agent_addr, data, 8); + hpsb_node_write(scsi_id->ne, scsi_id->management_agent_addr, data, 8); /* wait up to 20 seconds for login status */ if (sbp2util_access_timeout(scsi_id, 20*HZ)) { @@ -1163,10 +1164,10 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) } sbp2util_cpu_to_be32_buffer(scsi_id->login_response, sizeof(struct sbp2_login_response)); - scsi_id->sbp2_command_block_agent_addr = + scsi_id->command_block_agent_addr = ((u64)scsi_id->login_response->command_block_agent_hi) << 32; - scsi_id->sbp2_command_block_agent_addr |= ((u64)scsi_id->login_response->command_block_agent_lo); - scsi_id->sbp2_command_block_agent_addr &= 0x0000ffffffffffffULL; + scsi_id->command_block_agent_addr |= ((u64)scsi_id->login_response->command_block_agent_lo); + scsi_id->command_block_agent_addr &= 0x0000ffffffffffffULL; SBP2_INFO("Logged into SBP-2 device"); return 0; @@ -1174,7 +1175,7 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; quadlet_t data[2]; int error; @@ -1200,7 +1201,7 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) sbp2util_cpu_to_be32_buffer(data, 8); error = hpsb_node_write(scsi_id->ne, - scsi_id->sbp2_management_agent_addr, data, 8); + scsi_id->management_agent_addr, data, 8); if (error) return error; @@ -1214,7 +1215,7 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; quadlet_t data[2]; int error; @@ -1241,7 +1242,7 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) sbp2util_cpu_to_be32_buffer(data, 8); error = hpsb_node_write(scsi_id->ne, - scsi_id->sbp2_management_agent_addr, data, 8); + scsi_id->management_agent_addr, data, 8); if (error) return error; @@ -1306,7 +1307,7 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, (kv->value.csr_offset << 2); else if (kv->key.type == CSR1212_KV_TYPE_IMMEDIATE) - scsi_id->sbp2_lun = + scsi_id->lun = ORB_SET_LUN(kv->value.immediate); break; @@ -1363,12 +1364,12 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, /* We would need one SCSI host template for each target to adjust * max_sectors on the fly, therefore warn only. */ if (workarounds & SBP2_WORKAROUND_128K_MAX_TRANS && - (max_sectors * 512) > (128 * 1024)) + (sbp2_max_sectors * 512) > (128 * 1024)) SBP2_INFO("Node " NODE_BUS_FMT ": Bridge only supports 128KB " "max transfer size. WARNING: Current max_sectors " "setting is larger than 128KB (%d sectors)", NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid), - max_sectors); + sbp2_max_sectors); /* If this is a logical unit directory entry, process the parent * to get the values. */ @@ -1377,14 +1378,14 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, container_of(ud->device.parent, struct unit_directory, device); sbp2_parse_unit_directory(scsi_id, parent_ud); } else { - scsi_id->sbp2_management_agent_addr = management_agent_addr; - scsi_id->sbp2_command_set_spec_id = command_set_spec_id; - scsi_id->sbp2_command_set = command_set; - scsi_id->sbp2_unit_characteristics = unit_characteristics; - scsi_id->sbp2_firmware_revision = firmware_revision; + scsi_id->management_agent_addr = management_agent_addr; + scsi_id->command_set_spec_id = command_set_spec_id; + scsi_id->command_set = command_set; + scsi_id->unit_characteristics = unit_characteristics; + scsi_id->firmware_revision = firmware_revision; scsi_id->workarounds = workarounds; if (ud->flags & UNIT_DIRECTORY_HAS_LUN) - scsi_id->sbp2_lun = ORB_SET_LUN(ud->lun); + scsi_id->lun = ORB_SET_LUN(ud->lun); } } @@ -1401,15 +1402,16 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, */ static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; u8 payload; scsi_id->speed_code = hi->host->speed[NODEID_TO_NODE(scsi_id->ne->nodeid)]; - if (scsi_id->speed_code > max_speed) { - scsi_id->speed_code = max_speed; - SBP2_INFO("Reducing speed to %s", hpsb_speedto_str[max_speed]); + if (scsi_id->speed_code > sbp2_max_speed) { + scsi_id->speed_code = sbp2_max_speed; + SBP2_INFO("Reducing speed to %s", + hpsb_speedto_str[sbp2_max_speed]); } /* Payload size is the lesser of what our speed supports and what @@ -1445,7 +1447,7 @@ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) flush_scheduled_work(); data = ntohl(SBP2_AGENT_RESET_DATA); - addr = scsi_id->sbp2_command_block_agent_addr + SBP2_AGENT_RESET_OFFSET; + addr = scsi_id->command_block_agent_addr + SBP2_AGENT_RESET_OFFSET; if (wait) retval = hpsb_node_write(scsi_id->ne, addr, &data, 4); @@ -1458,15 +1460,15 @@ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) } /* make sure that the ORB_POINTER is written on next command */ - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); scsi_id->last_orb = NULL; - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); return 0; } static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, - struct sbp2scsi_host_info *hi, + struct sbp2_fwhost_info *hi, struct sbp2_command_info *command, unsigned int scsi_use_sg, struct scatterlist *sgpnt, @@ -1537,7 +1539,7 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, } static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, - struct sbp2scsi_host_info *hi, + struct sbp2_fwhost_info *hi, struct sbp2_command_info *command, struct scatterlist *sgpnt, u32 orb_direction, @@ -1606,7 +1608,7 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, void *scsi_request_buffer, enum dma_data_direction dma_dir) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; struct scatterlist *sgpnt = (struct scatterlist *)scsi_request_buffer; struct sbp2_command_orb *command_orb = &command->command_orb; u32 orb_direction; @@ -1658,11 +1660,11 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, struct sbp2_command_info *command) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; struct sbp2_command_orb *command_orb = &command->command_orb; struct sbp2_command_orb *last_orb; dma_addr_t last_orb_dma; - u64 addr = scsi_id->sbp2_command_block_agent_addr; + u64 addr = scsi_id->command_block_agent_addr; quadlet_t data[2]; size_t length; unsigned long flags; @@ -1675,7 +1677,7 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, PCI_DMA_BIDIRECTIONAL); /* check to see if there are any previous orbs to use */ - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); last_orb = scsi_id->last_orb; last_orb_dma = scsi_id->last_orb_dma; if (!last_orb) { @@ -1712,7 +1714,7 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, } scsi_id->last_orb = command_orb; scsi_id->last_orb_dma = command->command_orb_dma; - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); if (sbp2util_node_write_no_wait(scsi_id->ne, addr, data, length)) { /* @@ -1782,7 +1784,7 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data, u64 addr, size_t length, u16 fl) { - struct sbp2scsi_host_info *hi; + struct sbp2_fwhost_info *hi; struct scsi_id_instance_data *scsi_id = NULL, *scsi_id_tmp; struct scsi_cmnd *SCpnt = NULL; struct sbp2_status_block *sb; @@ -1845,9 +1847,9 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, * not be reused until status for a subsequent ORB is received. */ SCpnt = command->Current_SCpnt; - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); sbp2util_mark_command_completed(scsi_id, command); - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); if (SCpnt) { u32 h = sb->ORB_offset_hi_misc; @@ -1876,10 +1878,10 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, * last_orb so that next time we write directly to the * ORB_POINTER register. That way the fetch agent does not need * to refetch the next_ORB. */ - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); - if (list_empty(&scsi_id->sbp2_command_orb_inuse)) + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); + if (list_empty(&scsi_id->cmd_orb_inuse)) scsi_id->last_orb = NULL; - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); } else { /* It's probably status after a management request. */ @@ -1888,7 +1890,7 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, (sb->ORB_offset_lo == scsi_id->query_logins_orb_dma) || (sb->ORB_offset_lo == scsi_id->logout_orb_dma)) { scsi_id->access_complete = 1; - wake_up_interruptible(&access_wq); + wake_up_interruptible(&sbp2_access_wq); } } @@ -1907,7 +1909,7 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, { struct scsi_id_instance_data *scsi_id = (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0]; - struct sbp2scsi_host_info *hi; + struct sbp2_fwhost_info *hi; int result = DID_NO_CONNECT << 16; if (unlikely(!sbp2util_node_is_available(scsi_id))) @@ -1916,7 +1918,7 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, hi = scsi_id->hi; if (unlikely(!hi)) { - SBP2_ERR("sbp2scsi_host_info is NULL - this is bad!"); + SBP2_ERR("sbp2_fwhost_info is NULL - this is bad!"); goto done; } @@ -1964,14 +1966,14 @@ done: static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id, u32 status) { - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; struct list_head *lh; struct sbp2_command_info *command; unsigned long flags; - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); - while (!list_empty(&scsi_id->sbp2_command_orb_inuse)) { - lh = scsi_id->sbp2_command_orb_inuse.next; + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); + while (!list_empty(&scsi_id->cmd_orb_inuse)) { + lh = scsi_id->cmd_orb_inuse.next; command = list_entry(lh, struct sbp2_command_info, list); pci_dma_sync_single_for_cpu(hi->host->pdev, command->command_orb_dma, sizeof(struct sbp2_command_orb), @@ -1985,7 +1987,7 @@ static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id command->Current_done(command->Current_SCpnt); } } - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); return; } @@ -2090,7 +2092,7 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) { struct scsi_id_instance_data *scsi_id = (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0]; - struct sbp2scsi_host_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = scsi_id->hi; struct sbp2_command_info *command; unsigned long flags; @@ -2101,7 +2103,7 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) sbp2_agent_reset(scsi_id, 1); /* Return a matching command structure to the free pool. */ - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); + spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); command = sbp2util_find_command_for_SCpnt(scsi_id, SCpnt); if (command) { pci_dma_sync_single_for_cpu(hi->host->pdev, @@ -2118,7 +2120,7 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) command->Current_done(command->Current_SCpnt); } } - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); + spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY); } @@ -2150,7 +2152,6 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, { struct scsi_device *sdev; struct scsi_id_instance_data *scsi_id; - int lun; if (!(sdev = to_scsi_device(dev))) return 0; @@ -2158,10 +2159,8 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, if (!(scsi_id = (struct scsi_id_instance_data *)sdev->host->hostdata[0])) return 0; - lun = ORB_SET_LUN(scsi_id->sbp2_lun); - return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)scsi_id->ne->guid, - scsi_id->ud->id, lun); + scsi_id->ud->id, ORB_SET_LUN(scsi_id->lun)); } MODULE_AUTHOR("Ben Collins "); @@ -2173,15 +2172,15 @@ static int sbp2_module_init(void) { int ret; - if (serialize_io) { - scsi_driver_template.can_queue = 1; - scsi_driver_template.cmd_per_lun = 1; + if (sbp2_serialize_io) { + sbp2_shost_template.can_queue = 1; + sbp2_shost_template.cmd_per_lun = 1; } if (sbp2_default_workarounds & SBP2_WORKAROUND_128K_MAX_TRANS && - (max_sectors * 512) > (128 * 1024)) - max_sectors = 128 * 1024 / 512; - scsi_driver_template.max_sectors = max_sectors; + (sbp2_max_sectors * 512) > (128 * 1024)) + sbp2_max_sectors = 128 * 1024 / 512; + sbp2_shost_template.max_sectors = sbp2_max_sectors; hpsb_register_highlevel(&sbp2_highlevel); ret = hpsb_register_protocol(&sbp2_driver); diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index d1dbc0d..6c1f8ff1c 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -241,7 +241,7 @@ struct sbp2_status_block { * Representations of commands and devices */ -enum cmd_dma_types { +enum sbp2_dma_types { CMD_DMA_NONE, CMD_DMA_PAGE, CMD_DMA_SINGLE @@ -260,13 +260,13 @@ struct sbp2_command_info { dma_addr_t sge_dma ____cacheline_aligned; void *sge_buffer; dma_addr_t cmd_dma; - enum cmd_dma_types dma_type; + enum sbp2_dma_types dma_type; unsigned long dma_size; int dma_dir; }; /* Per FireWire host */ -struct sbp2scsi_host_info { +struct sbp2_fwhost_info { struct hpsb_host *host; struct list_head scsi_ids; }; @@ -291,17 +291,17 @@ struct scsi_id_instance_data { struct sbp2_status_block status_block; /* How to talk to the unit */ - u64 sbp2_management_agent_addr; - u64 sbp2_command_block_agent_addr; + u64 management_agent_addr; + u64 command_block_agent_addr; u32 speed_code; u32 max_payload_size; /* Pulled from the device's unit directory */ - u32 sbp2_command_set_spec_id; - u32 sbp2_command_set; - u32 sbp2_unit_characteristics; - u32 sbp2_lun; - u32 sbp2_firmware_revision; + u32 command_set_spec_id; + u32 command_set; + u32 unit_characteristics; + u32 firmware_revision; + u16 lun; /* Address for the unit to write status blocks to */ u64 status_fifo_addr; @@ -310,12 +310,12 @@ struct scsi_id_instance_data { int access_complete:1; /* Pool of command ORBs for this logical unit */ - spinlock_t sbp2_command_orb_lock; - struct list_head sbp2_command_orb_inuse; - struct list_head sbp2_command_orb_completed; + spinlock_t cmd_orb_lock; + struct list_head cmd_orb_inuse; + struct list_head cmd_orb_completed; /* Backlink to FireWire host; list of units attached to the host */ - struct sbp2scsi_host_info *hi; + struct sbp2_fwhost_info *hi; struct list_head scsi_list; /* IEEE 1394 core's device representations */ -- cgit v1.1 From 28b066795f26196003353e1b4f7beaf63158ee74 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: proper unit in module parameter description It's 2^20 bit/s, not 0.001 bit. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 6737af2..c926377 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -100,7 +100,8 @@ */ static int sbp2_max_speed = IEEE1394_SPEED_MAX; module_param_named(max_speed, sbp2_max_speed, int, 0644); -MODULE_PARM_DESC(max_speed, "Force max speed (3 = 800mb, 2 = 400mb, 1 = 200mb, 0 = 100mb)"); +MODULE_PARM_DESC(max_speed, "Force max speed " + "(3 = 800Mb/s, 2 = 400Mb/s, 1 = 200Mb/s, 0 = 100Mb/s)"); /* * Set serialize_io to 1 if you'd like only one scsi command sent -- cgit v1.1 From 9117c6dc430578748ce732c6ff25eed8ed501a97 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: remove unused struct members Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 23 ++++------------------- drivers/ieee1394/sbp2.h | 6 ------ 2 files changed, 4 insertions(+), 25 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index c926377..34280c7 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -1288,16 +1288,13 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, struct csr1212_keyval *kv; struct csr1212_dentry *dentry; u64 management_agent_addr; - u32 command_set_spec_id, command_set, unit_characteristics, - firmware_revision; + u32 unit_characteristics, firmware_revision; unsigned workarounds; int i; - management_agent_addr = 0x0; - command_set_spec_id = 0x0; - command_set = 0x0; - unit_characteristics = 0x0; - firmware_revision = 0x0; + management_agent_addr = 0; + unit_characteristics = 0; + firmware_revision = 0; csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) { switch (kv->key.id) { @@ -1312,14 +1309,6 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, ORB_SET_LUN(kv->value.immediate); break; - case SBP2_COMMAND_SET_SPEC_ID_KEY: - command_set_spec_id = kv->value.immediate; - break; - - case SBP2_COMMAND_SET_KEY: - command_set = kv->value.immediate; - break; - case SBP2_UNIT_CHARACTERISTICS_KEY: /* FIXME: This is ignored so far. * See SBP-2 clause 7.4.8. */ @@ -1380,10 +1369,6 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, sbp2_parse_unit_directory(scsi_id, parent_ud); } else { scsi_id->management_agent_addr = management_agent_addr; - scsi_id->command_set_spec_id = command_set_spec_id; - scsi_id->command_set = command_set; - scsi_id->unit_characteristics = unit_characteristics; - scsi_id->firmware_revision = firmware_revision; scsi_id->workarounds = workarounds; if (ud->flags & UNIT_DIRECTORY_HAS_LUN) scsi_id->lun = ORB_SET_LUN(ud->lun); diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index 6c1f8ff1c..8902a46 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -295,12 +295,6 @@ struct scsi_id_instance_data { u64 command_block_agent_addr; u32 speed_code; u32 max_payload_size; - - /* Pulled from the device's unit directory */ - u32 command_set_spec_id; - u32 command_set; - u32 unit_characteristics; - u32 firmware_revision; u16 lun; /* Address for the unit to write status blocks to */ -- cgit v1.1 From 138c8af8649ceea38aa52323b9326c10068bb597 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: more concise names for types and variables "struct scsi_id_instance_data" represents a logical unit. Rename it to "struct sbp2_lu", and "scsi_id" to "lu". Rename some other variables too. Wrap almost all lines after at most 80 columns. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 1158 +++++++++++++++++++++++------------------------ drivers/ieee1394/sbp2.h | 15 +- 2 files changed, 575 insertions(+), 598 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 34280c7..a7fb588 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -189,24 +189,23 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" /* * Globals */ -static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *, u32); -static void sbp2scsi_complete_command(struct scsi_id_instance_data *, u32, - struct scsi_cmnd *, +static void sbp2scsi_complete_all_commands(struct sbp2_lu *, u32); +static void sbp2scsi_complete_command(struct sbp2_lu *, u32, struct scsi_cmnd *, void (*)(struct scsi_cmnd *)); -static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *); -static int sbp2_start_device(struct scsi_id_instance_data *); -static void sbp2_remove_device(struct scsi_id_instance_data *); -static int sbp2_login_device(struct scsi_id_instance_data *); -static int sbp2_reconnect_device(struct scsi_id_instance_data *); -static int sbp2_logout_device(struct scsi_id_instance_data *); +static struct sbp2_lu *sbp2_alloc_device(struct unit_directory *); +static int sbp2_start_device(struct sbp2_lu *); +static void sbp2_remove_device(struct sbp2_lu *); +static int sbp2_login_device(struct sbp2_lu *); +static int sbp2_reconnect_device(struct sbp2_lu *); +static int sbp2_logout_device(struct sbp2_lu *); static void sbp2_host_reset(struct hpsb_host *); static int sbp2_handle_status_write(struct hpsb_host *, int, int, quadlet_t *, u64, size_t, u16); -static int sbp2_agent_reset(struct scsi_id_instance_data *, int); -static void sbp2_parse_unit_directory(struct scsi_id_instance_data *, +static int sbp2_agent_reset(struct sbp2_lu *, int); +static void sbp2_parse_unit_directory(struct sbp2_lu *, struct unit_directory *); -static int sbp2_set_busy_timeout(struct scsi_id_instance_data *); -static int sbp2_max_speed_and_size(struct scsi_id_instance_data *); +static int sbp2_set_busy_timeout(struct sbp2_lu *); +static int sbp2_max_speed_and_size(struct sbp2_lu *); static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC }; @@ -369,8 +368,6 @@ static inline void sbp2util_be32_to_cpu_buffer(void *buffer, int length) for (length = (length >> 2); length--; ) temp[length] = be32_to_cpu(temp[length]); - - return; } /* @@ -382,8 +379,6 @@ static inline void sbp2util_cpu_to_be32_buffer(void *buffer, int length) for (length = (length >> 2); length--; ) temp[length] = cpu_to_be32(temp[length]); - - return; } #else /* BIG_ENDIAN */ /* Why waste the cpu cycles? */ @@ -397,18 +392,17 @@ static DECLARE_WAIT_QUEUE_HEAD(sbp2_access_wq); * Waits for completion of an SBP-2 access request. * Returns nonzero if timed out or prematurely interrupted. */ -static int sbp2util_access_timeout(struct scsi_id_instance_data *scsi_id, - int timeout) +static int sbp2util_access_timeout(struct sbp2_lu *lu, int timeout) { long leftover; leftover = wait_event_interruptible_timeout( - sbp2_access_wq, scsi_id->access_complete, timeout); - scsi_id->access_complete = 0; + sbp2_access_wq, lu->access_complete, timeout); + lu->access_complete = 0; return leftover <= 0; } -static void sbp2_free_packet(struct hpsb_packet *packet) +static void sbp2_free_packet(void *packet) { hpsb_free_tlabel(packet); hpsb_free_packet(packet); @@ -419,121 +413,107 @@ static void sbp2_free_packet(struct hpsb_packet *packet) * subaction and returns immediately. Can be used from atomic context. */ static int sbp2util_node_write_no_wait(struct node_entry *ne, u64 addr, - quadlet_t *buffer, size_t length) + quadlet_t *buf, size_t len) { struct hpsb_packet *packet; - packet = hpsb_make_writepacket(ne->host, ne->nodeid, - addr, buffer, length); + packet = hpsb_make_writepacket(ne->host, ne->nodeid, addr, buf, len); if (!packet) return -ENOMEM; - hpsb_set_packet_complete_task(packet, - (void (*)(void *))sbp2_free_packet, - packet); - + hpsb_set_packet_complete_task(packet, sbp2_free_packet, packet); hpsb_node_fill_packet(ne, packet); - if (hpsb_send_packet(packet) < 0) { sbp2_free_packet(packet); return -EIO; } - return 0; } -static void sbp2util_notify_fetch_agent(struct scsi_id_instance_data *scsi_id, - u64 offset, quadlet_t *data, size_t len) +static void sbp2util_notify_fetch_agent(struct sbp2_lu *lu, u64 offset, + quadlet_t *data, size_t len) { - /* - * There is a small window after a bus reset within which the node - * entry's generation is current but the reconnect wasn't completed. - */ - if (unlikely(atomic_read(&scsi_id->state) == SBP2LU_STATE_IN_RESET)) + /* There is a small window after a bus reset within which the node + * entry's generation is current but the reconnect wasn't completed. */ + if (unlikely(atomic_read(&lu->state) == SBP2LU_STATE_IN_RESET)) return; - if (hpsb_node_write(scsi_id->ne, - scsi_id->command_block_agent_addr + offset, + if (hpsb_node_write(lu->ne, lu->command_block_agent_addr + offset, data, len)) SBP2_ERR("sbp2util_notify_fetch_agent failed."); - /* - * Now accept new SCSI commands, unless a bus reset happended during - * hpsb_node_write. - */ - if (likely(atomic_read(&scsi_id->state) != SBP2LU_STATE_IN_RESET)) - scsi_unblock_requests(scsi_id->scsi_host); + + /* Now accept new SCSI commands, unless a bus reset happended during + * hpsb_node_write. */ + if (likely(atomic_read(&lu->state) != SBP2LU_STATE_IN_RESET)) + scsi_unblock_requests(lu->shost); } static void sbp2util_write_orb_pointer(struct work_struct *work) { quadlet_t data[2]; - data[0] = ORB_SET_NODE_ID( - (container_of(work, struct scsi_id_instance_data, protocol_work))->hi->host->node_id); - data[1] = (container_of(work, struct scsi_id_instance_data, protocol_work))->last_orb_dma; + data[0] = ORB_SET_NODE_ID((container_of(work, struct sbp2_lu, protocol_work))->hi->host->node_id); + data[1] = (container_of(work, struct sbp2_lu, protocol_work))->last_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - sbp2util_notify_fetch_agent(container_of(work, struct scsi_id_instance_data, protocol_work), SBP2_ORB_POINTER_OFFSET, data, 8); + sbp2util_notify_fetch_agent(container_of(work, struct sbp2_lu, protocol_work), SBP2_ORB_POINTER_OFFSET, data, 8); } static void sbp2util_write_doorbell(struct work_struct *work) { - sbp2util_notify_fetch_agent(container_of(work, struct scsi_id_instance_data, protocol_work), SBP2_DOORBELL_OFFSET, NULL, 4); + sbp2util_notify_fetch_agent(container_of(work, struct sbp2_lu, protocol_work), SBP2_DOORBELL_OFFSET, NULL, 4); } -static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id) +static int sbp2util_create_command_orb_pool(struct sbp2_lu *lu) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; int i; unsigned long flags, orbs; - struct sbp2_command_info *command; + struct sbp2_command_info *cmd; orbs = sbp2_serialize_io ? 2 : SBP2_MAX_CMDS; - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); + spin_lock_irqsave(&lu->cmd_orb_lock, flags); for (i = 0; i < orbs; i++) { - command = kzalloc(sizeof(*command), GFP_ATOMIC); - if (!command) { - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, - flags); + cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); + if (!cmd) { + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); return -ENOMEM; } - command->command_orb_dma = - pci_map_single(hi->host->pdev, &command->command_orb, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - command->sge_dma = - pci_map_single(hi->host->pdev, - &command->scatter_gather_element, - sizeof(command->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); - INIT_LIST_HEAD(&command->list); - list_add_tail(&command->list, &scsi_id->cmd_orb_completed); + cmd->command_orb_dma = pci_map_single(hi->host->pdev, + &cmd->command_orb, + sizeof(struct sbp2_command_orb), + PCI_DMA_TODEVICE); + cmd->sge_dma = pci_map_single(hi->host->pdev, + &cmd->scatter_gather_element, + sizeof(cmd->scatter_gather_element), + PCI_DMA_BIDIRECTIONAL); + INIT_LIST_HEAD(&cmd->list); + list_add_tail(&cmd->list, &lu->cmd_orb_completed); } - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); return 0; } -static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id) +static void sbp2util_remove_command_orb_pool(struct sbp2_lu *lu) { - struct hpsb_host *host = scsi_id->hi->host; + struct hpsb_host *host = lu->hi->host; struct list_head *lh, *next; - struct sbp2_command_info *command; + struct sbp2_command_info *cmd; unsigned long flags; - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - if (!list_empty(&scsi_id->cmd_orb_completed)) { - list_for_each_safe(lh, next, &scsi_id->cmd_orb_completed) { - command = list_entry(lh, struct sbp2_command_info, list); - pci_unmap_single(host->pdev, command->command_orb_dma, + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + if (!list_empty(&lu->cmd_orb_completed)) + list_for_each_safe(lh, next, &lu->cmd_orb_completed) { + cmd = list_entry(lh, struct sbp2_command_info, list); + pci_unmap_single(host->pdev, cmd->command_orb_dma, sizeof(struct sbp2_command_orb), PCI_DMA_TODEVICE); - pci_unmap_single(host->pdev, command->sge_dma, - sizeof(command->scatter_gather_element), + pci_unmap_single(host->pdev, cmd->sge_dma, + sizeof(cmd->scatter_gather_element), PCI_DMA_BIDIRECTIONAL); - kfree(command); + kfree(cmd); } - } - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); return; } @@ -542,116 +522,114 @@ static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_ * Only looks at the in-use list. */ static struct sbp2_command_info *sbp2util_find_command_for_orb( - struct scsi_id_instance_data *scsi_id, dma_addr_t orb) + struct sbp2_lu *lu, dma_addr_t orb) { - struct sbp2_command_info *command; + struct sbp2_command_info *cmd; unsigned long flags; - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - if (!list_empty(&scsi_id->cmd_orb_inuse)) { - list_for_each_entry(command, &scsi_id->cmd_orb_inuse, list) { - if (command->command_orb_dma == orb) { - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); - return command; + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + if (!list_empty(&lu->cmd_orb_inuse)) + list_for_each_entry(cmd, &lu->cmd_orb_inuse, list) + if (cmd->command_orb_dma == orb) { + spin_unlock_irqrestore( + &lu->cmd_orb_lock, flags); + return cmd; } - } - } - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); return NULL; } /* * Finds the sbp2_command for a given outstanding SCpnt. * Only looks at the in-use list. - * Must be called with scsi_id->cmd_orb_lock held. + * Must be called with lu->cmd_orb_lock held. */ static struct sbp2_command_info *sbp2util_find_command_for_SCpnt( - struct scsi_id_instance_data *scsi_id, void *SCpnt) + struct sbp2_lu *lu, void *SCpnt) { - struct sbp2_command_info *command; + struct sbp2_command_info *cmd; - if (!list_empty(&scsi_id->cmd_orb_inuse)) - list_for_each_entry(command, &scsi_id->cmd_orb_inuse, list) - if (command->Current_SCpnt == SCpnt) - return command; + if (!list_empty(&lu->cmd_orb_inuse)) + list_for_each_entry(cmd, &lu->cmd_orb_inuse, list) + if (cmd->Current_SCpnt == SCpnt) + return cmd; return NULL; } static struct sbp2_command_info *sbp2util_allocate_command_orb( - struct scsi_id_instance_data *scsi_id, - struct scsi_cmnd *Current_SCpnt, - void (*Current_done)(struct scsi_cmnd *)) + struct sbp2_lu *lu, + struct scsi_cmnd *Current_SCpnt, + void (*Current_done)(struct scsi_cmnd *)) { struct list_head *lh; - struct sbp2_command_info *command = NULL; + struct sbp2_command_info *cmd = NULL; unsigned long flags; - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - if (!list_empty(&scsi_id->cmd_orb_completed)) { - lh = scsi_id->cmd_orb_completed.next; + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + if (!list_empty(&lu->cmd_orb_completed)) { + lh = lu->cmd_orb_completed.next; list_del(lh); - command = list_entry(lh, struct sbp2_command_info, list); - command->Current_done = Current_done; - command->Current_SCpnt = Current_SCpnt; - list_add_tail(&command->list, &scsi_id->cmd_orb_inuse); - } else { + cmd = list_entry(lh, struct sbp2_command_info, list); + cmd->Current_done = Current_done; + cmd->Current_SCpnt = Current_SCpnt; + list_add_tail(&cmd->list, &lu->cmd_orb_inuse); + } else SBP2_ERR("%s: no orbs available", __FUNCTION__); - } - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); - return command; + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); + return cmd; } -static void sbp2util_free_command_dma(struct sbp2_command_info *command) +static void sbp2util_free_command_dma(struct sbp2_command_info *cmd) { - struct scsi_id_instance_data *scsi_id = - (struct scsi_id_instance_data *)command->Current_SCpnt->device->host->hostdata[0]; + struct sbp2_lu *lu = (struct sbp2_lu *) + cmd->Current_SCpnt->device->host->hostdata[0]; struct hpsb_host *host; - if (!scsi_id) { - SBP2_ERR("%s: scsi_id == NULL", __FUNCTION__); + if (!lu) { + SBP2_ERR("%s: lu == NULL", __FUNCTION__); return; } - host = scsi_id->ud->ne->host; + host = lu->ud->ne->host; - if (command->cmd_dma) { - if (command->dma_type == CMD_DMA_SINGLE) - pci_unmap_single(host->pdev, command->cmd_dma, - command->dma_size, command->dma_dir); - else if (command->dma_type == CMD_DMA_PAGE) - pci_unmap_page(host->pdev, command->cmd_dma, - command->dma_size, command->dma_dir); + if (cmd->cmd_dma) { + if (cmd->dma_type == CMD_DMA_SINGLE) + pci_unmap_single(host->pdev, cmd->cmd_dma, + cmd->dma_size, cmd->dma_dir); + else if (cmd->dma_type == CMD_DMA_PAGE) + pci_unmap_page(host->pdev, cmd->cmd_dma, + cmd->dma_size, cmd->dma_dir); /* XXX: Check for CMD_DMA_NONE bug */ - command->dma_type = CMD_DMA_NONE; - command->cmd_dma = 0; + cmd->dma_type = CMD_DMA_NONE; + cmd->cmd_dma = 0; } - if (command->sge_buffer) { - pci_unmap_sg(host->pdev, command->sge_buffer, - command->dma_size, command->dma_dir); - command->sge_buffer = NULL; + if (cmd->sge_buffer) { + pci_unmap_sg(host->pdev, cmd->sge_buffer, + cmd->dma_size, cmd->dma_dir); + cmd->sge_buffer = NULL; } } /* * This function moves a command to the completed orb list. - * Must be called with scsi_id->cmd_orb_lock held. + * Must be called with lu->cmd_orb_lock held. */ static void sbp2util_mark_command_completed( - struct scsi_id_instance_data *scsi_id, - struct sbp2_command_info *command) + struct sbp2_lu *lu, + struct sbp2_command_info *cmd) { - list_del(&command->list); - sbp2util_free_command_dma(command); - list_add_tail(&command->list, &scsi_id->cmd_orb_completed); + list_del(&cmd->list); + sbp2util_free_command_dma(cmd); + list_add_tail(&cmd->list, &lu->cmd_orb_completed); } /* - * Is scsi_id valid? Is the 1394 node still present? + * Is lu valid? Is the 1394 node still present? */ -static inline int sbp2util_node_is_available(struct scsi_id_instance_data *scsi_id) +static inline int sbp2util_node_is_available(struct sbp2_lu *lu) { - return scsi_id && scsi_id->ne && !scsi_id->ne->in_limbo; + return lu && lu->ne && !lu->ne->in_limbo; } /********************************************* @@ -661,7 +639,7 @@ static inline int sbp2util_node_is_available(struct scsi_id_instance_data *scsi_ static int sbp2_probe(struct device *dev) { struct unit_directory *ud; - struct scsi_id_instance_data *scsi_id; + struct sbp2_lu *lu; ud = container_of(dev, struct unit_directory, device); @@ -670,60 +648,58 @@ static int sbp2_probe(struct device *dev) if (ud->flags & UNIT_DIRECTORY_HAS_LUN_DIRECTORY) return -ENODEV; - scsi_id = sbp2_alloc_device(ud); - - if (!scsi_id) + lu = sbp2_alloc_device(ud); + if (!lu) return -ENOMEM; - sbp2_parse_unit_directory(scsi_id, ud); - - return sbp2_start_device(scsi_id); + sbp2_parse_unit_directory(lu, ud); + return sbp2_start_device(lu); } static int sbp2_remove(struct device *dev) { struct unit_directory *ud; - struct scsi_id_instance_data *scsi_id; + struct sbp2_lu *lu; struct scsi_device *sdev; ud = container_of(dev, struct unit_directory, device); - scsi_id = ud->device.driver_data; - if (!scsi_id) + lu = ud->device.driver_data; + if (!lu) return 0; - if (scsi_id->scsi_host) { + if (lu->shost) { /* Get rid of enqueued commands if there is no chance to * send them. */ - if (!sbp2util_node_is_available(scsi_id)) - sbp2scsi_complete_all_commands(scsi_id, DID_NO_CONNECT); + if (!sbp2util_node_is_available(lu)) + sbp2scsi_complete_all_commands(lu, DID_NO_CONNECT); /* scsi_remove_device() may trigger shutdown functions of SCSI * highlevel drivers which would deadlock if blocked. */ - atomic_set(&scsi_id->state, SBP2LU_STATE_IN_SHUTDOWN); - scsi_unblock_requests(scsi_id->scsi_host); + atomic_set(&lu->state, SBP2LU_STATE_IN_SHUTDOWN); + scsi_unblock_requests(lu->shost); } - sdev = scsi_id->sdev; + sdev = lu->sdev; if (sdev) { - scsi_id->sdev = NULL; + lu->sdev = NULL; scsi_remove_device(sdev); } - sbp2_logout_device(scsi_id); - sbp2_remove_device(scsi_id); + sbp2_logout_device(lu); + sbp2_remove_device(lu); return 0; } static int sbp2_update(struct unit_directory *ud) { - struct scsi_id_instance_data *scsi_id = ud->device.driver_data; + struct sbp2_lu *lu = ud->device.driver_data; - if (sbp2_reconnect_device(scsi_id)) { + if (sbp2_reconnect_device(lu)) { /* Reconnect has failed. Perhaps we didn't reconnect fast * enough. Try a regular login, but first log out just in * case of any weirdness. */ - sbp2_logout_device(scsi_id); + sbp2_logout_device(lu); - if (sbp2_login_device(scsi_id)) { + if (sbp2_login_device(lu)) { /* Login failed too, just fail, and the backend * will call our sbp2_remove for us */ SBP2_ERR("Failed to reconnect to sbp2 device!"); @@ -731,58 +707,59 @@ static int sbp2_update(struct unit_directory *ud) } } - sbp2_set_busy_timeout(scsi_id); - sbp2_agent_reset(scsi_id, 1); - sbp2_max_speed_and_size(scsi_id); + sbp2_set_busy_timeout(lu); + sbp2_agent_reset(lu, 1); + sbp2_max_speed_and_size(lu); /* Complete any pending commands with busy (so they get retried) * and remove them from our queue. */ - sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY); + sbp2scsi_complete_all_commands(lu, DID_BUS_BUSY); /* Accept new commands unless there was another bus reset in the * meantime. */ - if (hpsb_node_entry_valid(scsi_id->ne)) { - atomic_set(&scsi_id->state, SBP2LU_STATE_RUNNING); - scsi_unblock_requests(scsi_id->scsi_host); + if (hpsb_node_entry_valid(lu->ne)) { + atomic_set(&lu->state, SBP2LU_STATE_RUNNING); + scsi_unblock_requests(lu->shost); } return 0; } -static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud) +static struct sbp2_lu *sbp2_alloc_device(struct unit_directory *ud) { struct sbp2_fwhost_info *hi; - struct Scsi_Host *scsi_host = NULL; - struct scsi_id_instance_data *scsi_id = NULL; + struct Scsi_Host *shost = NULL; + struct sbp2_lu *lu = NULL; - scsi_id = kzalloc(sizeof(*scsi_id), GFP_KERNEL); - if (!scsi_id) { - SBP2_ERR("failed to create scsi_id"); + lu = kzalloc(sizeof(*lu), GFP_KERNEL); + if (!lu) { + SBP2_ERR("failed to create lu"); goto failed_alloc; } - scsi_id->ne = ud->ne; - scsi_id->ud = ud; - scsi_id->speed_code = IEEE1394_SPEED_100; - scsi_id->max_payload_size = sbp2_speedto_max_payload[IEEE1394_SPEED_100]; - scsi_id->status_fifo_addr = CSR1212_INVALID_ADDR_SPACE; - INIT_LIST_HEAD(&scsi_id->cmd_orb_inuse); - INIT_LIST_HEAD(&scsi_id->cmd_orb_completed); - INIT_LIST_HEAD(&scsi_id->scsi_list); - spin_lock_init(&scsi_id->cmd_orb_lock); - atomic_set(&scsi_id->state, SBP2LU_STATE_RUNNING); - INIT_WORK(&scsi_id->protocol_work, NULL); + lu->ne = ud->ne; + lu->ud = ud; + lu->speed_code = IEEE1394_SPEED_100; + lu->max_payload_size = sbp2_speedto_max_payload[IEEE1394_SPEED_100]; + lu->status_fifo_addr = CSR1212_INVALID_ADDR_SPACE; + INIT_LIST_HEAD(&lu->cmd_orb_inuse); + INIT_LIST_HEAD(&lu->cmd_orb_completed); + INIT_LIST_HEAD(&lu->lu_list); + spin_lock_init(&lu->cmd_orb_lock); + atomic_set(&lu->state, SBP2LU_STATE_RUNNING); + INIT_WORK(&lu->protocol_work, NULL); - ud->device.driver_data = scsi_id; + ud->device.driver_data = lu; hi = hpsb_get_hostinfo(&sbp2_highlevel, ud->ne->host); if (!hi) { - hi = hpsb_create_hostinfo(&sbp2_highlevel, ud->ne->host, sizeof(*hi)); + hi = hpsb_create_hostinfo(&sbp2_highlevel, ud->ne->host, + sizeof(*hi)); if (!hi) { SBP2_ERR("failed to allocate hostinfo"); goto failed_alloc; } hi->host = ud->ne->host; - INIT_LIST_HEAD(&hi->scsi_ids); + INIT_LIST_HEAD(&hi->logical_units); #ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA /* Handle data movement if physical dma is not @@ -802,9 +779,9 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud goto failed_alloc; } - scsi_id->hi = hi; + lu->hi = hi; - list_add_tail(&scsi_id->scsi_list, &hi->scsi_ids); + list_add_tail(&lu->lu_list, &hi->logical_units); /* Register the status FIFO address range. We could use the same FIFO * for targets at different nodes. However we need different FIFOs per @@ -814,197 +791,190 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud * then be performed as unified transactions. This slightly reduces * bandwidth usage, and some Prolific based devices seem to require it. */ - scsi_id->status_fifo_addr = hpsb_allocate_and_register_addrspace( + lu->status_fifo_addr = hpsb_allocate_and_register_addrspace( &sbp2_highlevel, ud->ne->host, &sbp2_ops, sizeof(struct sbp2_status_block), sizeof(quadlet_t), ud->ne->host->low_addr_space, CSR1212_ALL_SPACE_END); - if (scsi_id->status_fifo_addr == CSR1212_INVALID_ADDR_SPACE) { + if (lu->status_fifo_addr == CSR1212_INVALID_ADDR_SPACE) { SBP2_ERR("failed to allocate status FIFO address range"); goto failed_alloc; } - scsi_host = scsi_host_alloc(&sbp2_shost_template, - sizeof(unsigned long)); - if (!scsi_host) { + shost = scsi_host_alloc(&sbp2_shost_template, sizeof(unsigned long)); + if (!shost) { SBP2_ERR("failed to register scsi host"); goto failed_alloc; } - scsi_host->hostdata[0] = (unsigned long)scsi_id; + shost->hostdata[0] = (unsigned long)lu; - if (!scsi_add_host(scsi_host, &ud->device)) { - scsi_id->scsi_host = scsi_host; - return scsi_id; + if (!scsi_add_host(shost, &ud->device)) { + lu->shost = shost; + return lu; } SBP2_ERR("failed to add scsi host"); - scsi_host_put(scsi_host); + scsi_host_put(shost); failed_alloc: - sbp2_remove_device(scsi_id); + sbp2_remove_device(lu); return NULL; } static void sbp2_host_reset(struct hpsb_host *host) { struct sbp2_fwhost_info *hi; - struct scsi_id_instance_data *scsi_id; + struct sbp2_lu *lu; hi = hpsb_get_hostinfo(&sbp2_highlevel, host); if (!hi) return; - list_for_each_entry(scsi_id, &hi->scsi_ids, scsi_list) - if (likely(atomic_read(&scsi_id->state) != + list_for_each_entry(lu, &hi->logical_units, lu_list) + if (likely(atomic_read(&lu->state) != SBP2LU_STATE_IN_SHUTDOWN)) { - atomic_set(&scsi_id->state, SBP2LU_STATE_IN_RESET); - scsi_block_requests(scsi_id->scsi_host); + atomic_set(&lu->state, SBP2LU_STATE_IN_RESET); + scsi_block_requests(lu->shost); } } -static int sbp2_start_device(struct scsi_id_instance_data *scsi_id) +static int sbp2_start_device(struct sbp2_lu *lu) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; int error; - scsi_id->login_response = - pci_alloc_consistent(hi->host->pdev, + lu->login_response = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_login_response), - &scsi_id->login_response_dma); - if (!scsi_id->login_response) + &lu->login_response_dma); + if (!lu->login_response) goto alloc_fail; - scsi_id->query_logins_orb = - pci_alloc_consistent(hi->host->pdev, + lu->query_logins_orb = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_orb), - &scsi_id->query_logins_orb_dma); - if (!scsi_id->query_logins_orb) + &lu->query_logins_orb_dma); + if (!lu->query_logins_orb) goto alloc_fail; - scsi_id->query_logins_response = - pci_alloc_consistent(hi->host->pdev, + lu->query_logins_response = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_response), - &scsi_id->query_logins_response_dma); - if (!scsi_id->query_logins_response) + &lu->query_logins_response_dma); + if (!lu->query_logins_response) goto alloc_fail; - scsi_id->reconnect_orb = - pci_alloc_consistent(hi->host->pdev, + lu->reconnect_orb = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_reconnect_orb), - &scsi_id->reconnect_orb_dma); - if (!scsi_id->reconnect_orb) + &lu->reconnect_orb_dma); + if (!lu->reconnect_orb) goto alloc_fail; - scsi_id->logout_orb = - pci_alloc_consistent(hi->host->pdev, + lu->logout_orb = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_logout_orb), - &scsi_id->logout_orb_dma); - if (!scsi_id->logout_orb) + &lu->logout_orb_dma); + if (!lu->logout_orb) goto alloc_fail; - scsi_id->login_orb = - pci_alloc_consistent(hi->host->pdev, + lu->login_orb = pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_login_orb), - &scsi_id->login_orb_dma); - if (!scsi_id->login_orb) + &lu->login_orb_dma); + if (!lu->login_orb) goto alloc_fail; - if (sbp2util_create_command_orb_pool(scsi_id)) { + if (sbp2util_create_command_orb_pool(lu)) { SBP2_ERR("sbp2util_create_command_orb_pool failed!"); - sbp2_remove_device(scsi_id); + sbp2_remove_device(lu); return -ENOMEM; } /* Wait a second before trying to log in. Previously logged in * initiators need a chance to reconnect. */ if (msleep_interruptible(1000)) { - sbp2_remove_device(scsi_id); + sbp2_remove_device(lu); return -EINTR; } - if (sbp2_login_device(scsi_id)) { - sbp2_remove_device(scsi_id); + if (sbp2_login_device(lu)) { + sbp2_remove_device(lu); return -EBUSY; } - sbp2_set_busy_timeout(scsi_id); - sbp2_agent_reset(scsi_id, 1); - sbp2_max_speed_and_size(scsi_id); + sbp2_set_busy_timeout(lu); + sbp2_agent_reset(lu, 1); + sbp2_max_speed_and_size(lu); - error = scsi_add_device(scsi_id->scsi_host, 0, scsi_id->ud->id, 0); + error = scsi_add_device(lu->shost, 0, lu->ud->id, 0); if (error) { SBP2_ERR("scsi_add_device failed"); - sbp2_logout_device(scsi_id); - sbp2_remove_device(scsi_id); + sbp2_logout_device(lu); + sbp2_remove_device(lu); return error; } return 0; alloc_fail: - SBP2_ERR("Could not allocate memory for scsi_id"); - sbp2_remove_device(scsi_id); + SBP2_ERR("Could not allocate memory for lu"); + sbp2_remove_device(lu); return -ENOMEM; } -static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id) +static void sbp2_remove_device(struct sbp2_lu *lu) { struct sbp2_fwhost_info *hi; - if (!scsi_id) + if (!lu) return; - hi = scsi_id->hi; + hi = lu->hi; - if (scsi_id->scsi_host) { - scsi_remove_host(scsi_id->scsi_host); - scsi_host_put(scsi_id->scsi_host); + if (lu->shost) { + scsi_remove_host(lu->shost); + scsi_host_put(lu->shost); } flush_scheduled_work(); - sbp2util_remove_command_orb_pool(scsi_id); + sbp2util_remove_command_orb_pool(lu); - list_del(&scsi_id->scsi_list); + list_del(&lu->lu_list); - if (scsi_id->login_response) + if (lu->login_response) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_login_response), - scsi_id->login_response, - scsi_id->login_response_dma); - if (scsi_id->login_orb) + lu->login_response, + lu->login_response_dma); + if (lu->login_orb) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_login_orb), - scsi_id->login_orb, - scsi_id->login_orb_dma); - if (scsi_id->reconnect_orb) + lu->login_orb, + lu->login_orb_dma); + if (lu->reconnect_orb) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_reconnect_orb), - scsi_id->reconnect_orb, - scsi_id->reconnect_orb_dma); - if (scsi_id->logout_orb) + lu->reconnect_orb, + lu->reconnect_orb_dma); + if (lu->logout_orb) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_logout_orb), - scsi_id->logout_orb, - scsi_id->logout_orb_dma); - if (scsi_id->query_logins_orb) + lu->logout_orb, + lu->logout_orb_dma); + if (lu->query_logins_orb) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_orb), - scsi_id->query_logins_orb, - scsi_id->query_logins_orb_dma); - if (scsi_id->query_logins_response) + lu->query_logins_orb, + lu->query_logins_orb_dma); + if (lu->query_logins_response) pci_free_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_response), - scsi_id->query_logins_response, - scsi_id->query_logins_response_dma); + lu->query_logins_response, + lu->query_logins_response_dma); - if (scsi_id->status_fifo_addr != CSR1212_INVALID_ADDR_SPACE) + if (lu->status_fifo_addr != CSR1212_INVALID_ADDR_SPACE) hpsb_unregister_addrspace(&sbp2_highlevel, hi->host, - scsi_id->status_fifo_addr); + lu->status_fifo_addr); - scsi_id->ud->device.driver_data = NULL; + lu->ud->device.driver_data = NULL; if (hi) module_put(hi->host->driver->owner); - kfree(scsi_id); + kfree(lu); } #ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA @@ -1037,62 +1007,69 @@ static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, * SBP-2 protocol related section **************************************/ -static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) +static int sbp2_query_logins(struct sbp2_lu *lu) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; quadlet_t data[2]; int max_logins; int active_logins; - scsi_id->query_logins_orb->reserved1 = 0x0; - scsi_id->query_logins_orb->reserved2 = 0x0; - - scsi_id->query_logins_orb->query_response_lo = scsi_id->query_logins_response_dma; - scsi_id->query_logins_orb->query_response_hi = ORB_SET_NODE_ID(hi->host->node_id); + lu->query_logins_orb->reserved1 = 0x0; + lu->query_logins_orb->reserved2 = 0x0; - scsi_id->query_logins_orb->lun_misc = ORB_SET_FUNCTION(SBP2_QUERY_LOGINS_REQUEST); - scsi_id->query_logins_orb->lun_misc |= ORB_SET_NOTIFY(1); - scsi_id->query_logins_orb->lun_misc |= ORB_SET_LUN(scsi_id->lun); + lu->query_logins_orb->query_response_lo = lu->query_logins_response_dma; + lu->query_logins_orb->query_response_hi = + ORB_SET_NODE_ID(hi->host->node_id); + lu->query_logins_orb->lun_misc = + ORB_SET_FUNCTION(SBP2_QUERY_LOGINS_REQUEST); + lu->query_logins_orb->lun_misc |= ORB_SET_NOTIFY(1); + lu->query_logins_orb->lun_misc |= ORB_SET_LUN(lu->lun); - scsi_id->query_logins_orb->reserved_resp_length = - ORB_SET_QUERY_LOGINS_RESP_LENGTH(sizeof(struct sbp2_query_logins_response)); + lu->query_logins_orb->reserved_resp_length = + ORB_SET_QUERY_LOGINS_RESP_LENGTH( + sizeof(struct sbp2_query_logins_response)); - scsi_id->query_logins_orb->status_fifo_hi = - ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id); - scsi_id->query_logins_orb->status_fifo_lo = - ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr); + lu->query_logins_orb->status_fifo_hi = + ORB_SET_STATUS_FIFO_HI(lu->status_fifo_addr, hi->host->node_id); + lu->query_logins_orb->status_fifo_lo = + ORB_SET_STATUS_FIFO_LO(lu->status_fifo_addr); - sbp2util_cpu_to_be32_buffer(scsi_id->query_logins_orb, sizeof(struct sbp2_query_logins_orb)); + sbp2util_cpu_to_be32_buffer(lu->query_logins_orb, + sizeof(struct sbp2_query_logins_orb)); - memset(scsi_id->query_logins_response, 0, sizeof(struct sbp2_query_logins_response)); + memset(lu->query_logins_response, 0, + sizeof(struct sbp2_query_logins_response)); data[0] = ORB_SET_NODE_ID(hi->host->node_id); - data[1] = scsi_id->query_logins_orb_dma; + data[1] = lu->query_logins_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - hpsb_node_write(scsi_id->ne, scsi_id->management_agent_addr, data, 8); + hpsb_node_write(lu->ne, lu->management_agent_addr, data, 8); - if (sbp2util_access_timeout(scsi_id, 2*HZ)) { + if (sbp2util_access_timeout(lu, 2*HZ)) { SBP2_INFO("Error querying logins to SBP-2 device - timed out"); return -EIO; } - if (scsi_id->status_block.ORB_offset_lo != scsi_id->query_logins_orb_dma) { + if (lu->status_block.ORB_offset_lo != lu->query_logins_orb_dma) { SBP2_INFO("Error querying logins to SBP-2 device - timed out"); return -EIO; } - if (STATUS_TEST_RDS(scsi_id->status_block.ORB_offset_hi_misc)) { + if (STATUS_TEST_RDS(lu->status_block.ORB_offset_hi_misc)) { SBP2_INFO("Error querying logins to SBP-2 device - failed"); return -EIO; } - sbp2util_cpu_to_be32_buffer(scsi_id->query_logins_response, sizeof(struct sbp2_query_logins_response)); + sbp2util_cpu_to_be32_buffer(lu->query_logins_response, + sizeof(struct sbp2_query_logins_response)); - max_logins = RESPONSE_GET_MAX_LOGINS(scsi_id->query_logins_response->length_max_logins); + max_logins = RESPONSE_GET_MAX_LOGINS( + lu->query_logins_response->length_max_logins); SBP2_INFO("Maximum concurrent logins supported: %d", max_logins); - active_logins = RESPONSE_GET_ACTIVE_LOGINS(scsi_id->query_logins_response->length_max_logins); + active_logins = RESPONSE_GET_ACTIVE_LOGINS( + lu->query_logins_response->length_max_logins); SBP2_INFO("Number of active logins: %d", active_logins); if (active_logins >= max_logins) { @@ -1102,164 +1079,169 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id) return 0; } -static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) +static int sbp2_login_device(struct sbp2_lu *lu) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; quadlet_t data[2]; - if (!scsi_id->login_orb) + if (!lu->login_orb) return -EIO; - if (!sbp2_exclusive_login && sbp2_query_logins(scsi_id)) { + if (!sbp2_exclusive_login && sbp2_query_logins(lu)) { SBP2_INFO("Device does not support any more concurrent logins"); return -EIO; } /* assume no password */ - scsi_id->login_orb->password_hi = 0; - scsi_id->login_orb->password_lo = 0; + lu->login_orb->password_hi = 0; + lu->login_orb->password_lo = 0; - scsi_id->login_orb->login_response_lo = scsi_id->login_response_dma; - scsi_id->login_orb->login_response_hi = ORB_SET_NODE_ID(hi->host->node_id); - scsi_id->login_orb->lun_misc = ORB_SET_FUNCTION(SBP2_LOGIN_REQUEST); + lu->login_orb->login_response_lo = lu->login_response_dma; + lu->login_orb->login_response_hi = ORB_SET_NODE_ID(hi->host->node_id); + lu->login_orb->lun_misc = ORB_SET_FUNCTION(SBP2_LOGIN_REQUEST); /* one second reconnect time */ - scsi_id->login_orb->lun_misc |= ORB_SET_RECONNECT(0); - scsi_id->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(sbp2_exclusive_login); - scsi_id->login_orb->lun_misc |= ORB_SET_NOTIFY(1); - scsi_id->login_orb->lun_misc |= ORB_SET_LUN(scsi_id->lun); + lu->login_orb->lun_misc |= ORB_SET_RECONNECT(0); + lu->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(sbp2_exclusive_login); + lu->login_orb->lun_misc |= ORB_SET_NOTIFY(1); + lu->login_orb->lun_misc |= ORB_SET_LUN(lu->lun); - scsi_id->login_orb->passwd_resp_lengths = + lu->login_orb->passwd_resp_lengths = ORB_SET_LOGIN_RESP_LENGTH(sizeof(struct sbp2_login_response)); - scsi_id->login_orb->status_fifo_hi = - ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id); - scsi_id->login_orb->status_fifo_lo = - ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr); + lu->login_orb->status_fifo_hi = + ORB_SET_STATUS_FIFO_HI(lu->status_fifo_addr, hi->host->node_id); + lu->login_orb->status_fifo_lo = + ORB_SET_STATUS_FIFO_LO(lu->status_fifo_addr); - sbp2util_cpu_to_be32_buffer(scsi_id->login_orb, sizeof(struct sbp2_login_orb)); + sbp2util_cpu_to_be32_buffer(lu->login_orb, + sizeof(struct sbp2_login_orb)); - memset(scsi_id->login_response, 0, sizeof(struct sbp2_login_response)); + memset(lu->login_response, 0, sizeof(struct sbp2_login_response)); data[0] = ORB_SET_NODE_ID(hi->host->node_id); - data[1] = scsi_id->login_orb_dma; + data[1] = lu->login_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - hpsb_node_write(scsi_id->ne, scsi_id->management_agent_addr, data, 8); + hpsb_node_write(lu->ne, lu->management_agent_addr, data, 8); /* wait up to 20 seconds for login status */ - if (sbp2util_access_timeout(scsi_id, 20*HZ)) { + if (sbp2util_access_timeout(lu, 20*HZ)) { SBP2_ERR("Error logging into SBP-2 device - timed out"); return -EIO; } /* make sure that the returned status matches the login ORB */ - if (scsi_id->status_block.ORB_offset_lo != scsi_id->login_orb_dma) { + if (lu->status_block.ORB_offset_lo != lu->login_orb_dma) { SBP2_ERR("Error logging into SBP-2 device - timed out"); return -EIO; } - if (STATUS_TEST_RDS(scsi_id->status_block.ORB_offset_hi_misc)) { + if (STATUS_TEST_RDS(lu->status_block.ORB_offset_hi_misc)) { SBP2_ERR("Error logging into SBP-2 device - failed"); return -EIO; } - sbp2util_cpu_to_be32_buffer(scsi_id->login_response, sizeof(struct sbp2_login_response)); - scsi_id->command_block_agent_addr = - ((u64)scsi_id->login_response->command_block_agent_hi) << 32; - scsi_id->command_block_agent_addr |= ((u64)scsi_id->login_response->command_block_agent_lo); - scsi_id->command_block_agent_addr &= 0x0000ffffffffffffULL; + sbp2util_cpu_to_be32_buffer(lu->login_response, + sizeof(struct sbp2_login_response)); + lu->command_block_agent_addr = + ((u64)lu->login_response->command_block_agent_hi) << 32; + lu->command_block_agent_addr |= + ((u64)lu->login_response->command_block_agent_lo); + lu->command_block_agent_addr &= 0x0000ffffffffffffULL; SBP2_INFO("Logged into SBP-2 device"); return 0; } -static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) +static int sbp2_logout_device(struct sbp2_lu *lu) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; quadlet_t data[2]; int error; - scsi_id->logout_orb->reserved1 = 0x0; - scsi_id->logout_orb->reserved2 = 0x0; - scsi_id->logout_orb->reserved3 = 0x0; - scsi_id->logout_orb->reserved4 = 0x0; + lu->logout_orb->reserved1 = 0x0; + lu->logout_orb->reserved2 = 0x0; + lu->logout_orb->reserved3 = 0x0; + lu->logout_orb->reserved4 = 0x0; - scsi_id->logout_orb->login_ID_misc = ORB_SET_FUNCTION(SBP2_LOGOUT_REQUEST); - scsi_id->logout_orb->login_ID_misc |= ORB_SET_LOGIN_ID(scsi_id->login_response->length_login_ID); - scsi_id->logout_orb->login_ID_misc |= ORB_SET_NOTIFY(1); + lu->logout_orb->login_ID_misc = ORB_SET_FUNCTION(SBP2_LOGOUT_REQUEST); + lu->logout_orb->login_ID_misc |= + ORB_SET_LOGIN_ID(lu->login_response->length_login_ID); + lu->logout_orb->login_ID_misc |= ORB_SET_NOTIFY(1); - scsi_id->logout_orb->reserved5 = 0x0; - scsi_id->logout_orb->status_fifo_hi = - ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id); - scsi_id->logout_orb->status_fifo_lo = - ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr); + lu->logout_orb->reserved5 = 0x0; + lu->logout_orb->status_fifo_hi = + ORB_SET_STATUS_FIFO_HI(lu->status_fifo_addr, hi->host->node_id); + lu->logout_orb->status_fifo_lo = + ORB_SET_STATUS_FIFO_LO(lu->status_fifo_addr); - sbp2util_cpu_to_be32_buffer(scsi_id->logout_orb, sizeof(struct sbp2_logout_orb)); + sbp2util_cpu_to_be32_buffer(lu->logout_orb, + sizeof(struct sbp2_logout_orb)); data[0] = ORB_SET_NODE_ID(hi->host->node_id); - data[1] = scsi_id->logout_orb_dma; + data[1] = lu->logout_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - error = hpsb_node_write(scsi_id->ne, - scsi_id->management_agent_addr, data, 8); + error = hpsb_node_write(lu->ne, lu->management_agent_addr, data, 8); if (error) return error; /* wait up to 1 second for the device to complete logout */ - if (sbp2util_access_timeout(scsi_id, HZ)) + if (sbp2util_access_timeout(lu, HZ)) return -EIO; SBP2_INFO("Logged out of SBP-2 device"); return 0; } -static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) +static int sbp2_reconnect_device(struct sbp2_lu *lu) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; quadlet_t data[2]; int error; - scsi_id->reconnect_orb->reserved1 = 0x0; - scsi_id->reconnect_orb->reserved2 = 0x0; - scsi_id->reconnect_orb->reserved3 = 0x0; - scsi_id->reconnect_orb->reserved4 = 0x0; + lu->reconnect_orb->reserved1 = 0x0; + lu->reconnect_orb->reserved2 = 0x0; + lu->reconnect_orb->reserved3 = 0x0; + lu->reconnect_orb->reserved4 = 0x0; - scsi_id->reconnect_orb->login_ID_misc = ORB_SET_FUNCTION(SBP2_RECONNECT_REQUEST); - scsi_id->reconnect_orb->login_ID_misc |= - ORB_SET_LOGIN_ID(scsi_id->login_response->length_login_ID); - scsi_id->reconnect_orb->login_ID_misc |= ORB_SET_NOTIFY(1); + lu->reconnect_orb->login_ID_misc = + ORB_SET_FUNCTION(SBP2_RECONNECT_REQUEST); + lu->reconnect_orb->login_ID_misc |= + ORB_SET_LOGIN_ID(lu->login_response->length_login_ID); + lu->reconnect_orb->login_ID_misc |= ORB_SET_NOTIFY(1); - scsi_id->reconnect_orb->reserved5 = 0x0; - scsi_id->reconnect_orb->status_fifo_hi = - ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id); - scsi_id->reconnect_orb->status_fifo_lo = - ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr); + lu->reconnect_orb->reserved5 = 0x0; + lu->reconnect_orb->status_fifo_hi = + ORB_SET_STATUS_FIFO_HI(lu->status_fifo_addr, hi->host->node_id); + lu->reconnect_orb->status_fifo_lo = + ORB_SET_STATUS_FIFO_LO(lu->status_fifo_addr); - sbp2util_cpu_to_be32_buffer(scsi_id->reconnect_orb, sizeof(struct sbp2_reconnect_orb)); + sbp2util_cpu_to_be32_buffer(lu->reconnect_orb, + sizeof(struct sbp2_reconnect_orb)); data[0] = ORB_SET_NODE_ID(hi->host->node_id); - data[1] = scsi_id->reconnect_orb_dma; + data[1] = lu->reconnect_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - error = hpsb_node_write(scsi_id->ne, - scsi_id->management_agent_addr, data, 8); + error = hpsb_node_write(lu->ne, lu->management_agent_addr, data, 8); if (error) return error; /* wait up to 1 second for reconnect status */ - if (sbp2util_access_timeout(scsi_id, HZ)) { + if (sbp2util_access_timeout(lu, HZ)) { SBP2_ERR("Error reconnecting to SBP-2 device - timed out"); return -EIO; } /* make sure that the returned status matches the reconnect ORB */ - if (scsi_id->status_block.ORB_offset_lo != scsi_id->reconnect_orb_dma) { + if (lu->status_block.ORB_offset_lo != lu->reconnect_orb_dma) { SBP2_ERR("Error reconnecting to SBP-2 device - timed out"); return -EIO; } - if (STATUS_TEST_RDS(scsi_id->status_block.ORB_offset_hi_misc)) { + if (STATUS_TEST_RDS(lu->status_block.ORB_offset_hi_misc)) { SBP2_ERR("Error reconnecting to SBP-2 device - failed"); return -EIO; } @@ -1272,17 +1254,17 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) * Set the target node's Single Phase Retry limit. Affects the target's retry * behaviour if our node is too busy to accept requests. */ -static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id) +static int sbp2_set_busy_timeout(struct sbp2_lu *lu) { quadlet_t data; data = cpu_to_be32(SBP2_BUSY_TIMEOUT_VALUE); - if (hpsb_node_write(scsi_id->ne, SBP2_BUSY_TIMEOUT_ADDRESS, &data, 4)) + if (hpsb_node_write(lu->ne, SBP2_BUSY_TIMEOUT_ADDRESS, &data, 4)) SBP2_ERR("%s error", __FUNCTION__); return 0; } -static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, +static void sbp2_parse_unit_directory(struct sbp2_lu *lu, struct unit_directory *ud) { struct csr1212_keyval *kv; @@ -1305,8 +1287,7 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, (kv->value.csr_offset << 2); else if (kv->key.type == CSR1212_KV_TYPE_IMMEDIATE) - scsi_id->lun = - ORB_SET_LUN(kv->value.immediate); + lu->lun = ORB_SET_LUN(kv->value.immediate); break; case SBP2_UNIT_CHARACTERISTICS_KEY: @@ -1364,14 +1345,14 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, /* If this is a logical unit directory entry, process the parent * to get the values. */ if (ud->flags & UNIT_DIRECTORY_LUN_DIRECTORY) { - struct unit_directory *parent_ud = - container_of(ud->device.parent, struct unit_directory, device); - sbp2_parse_unit_directory(scsi_id, parent_ud); + struct unit_directory *parent_ud = container_of( + ud->device.parent, struct unit_directory, device); + sbp2_parse_unit_directory(lu, parent_ud); } else { - scsi_id->management_agent_addr = management_agent_addr; - scsi_id->workarounds = workarounds; + lu->management_agent_addr = management_agent_addr; + lu->workarounds = workarounds; if (ud->flags & UNIT_DIRECTORY_HAS_LUN) - scsi_id->lun = ORB_SET_LUN(ud->lun); + lu->lun = ORB_SET_LUN(ud->lun); } } @@ -1386,59 +1367,58 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id, * the speed that it needs to use, and the max_rec the host supports, and * it takes care of the rest. */ -static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id) +static int sbp2_max_speed_and_size(struct sbp2_lu *lu) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; u8 payload; - scsi_id->speed_code = - hi->host->speed[NODEID_TO_NODE(scsi_id->ne->nodeid)]; + lu->speed_code = hi->host->speed[NODEID_TO_NODE(lu->ne->nodeid)]; - if (scsi_id->speed_code > sbp2_max_speed) { - scsi_id->speed_code = sbp2_max_speed; + if (lu->speed_code > sbp2_max_speed) { + lu->speed_code = sbp2_max_speed; SBP2_INFO("Reducing speed to %s", hpsb_speedto_str[sbp2_max_speed]); } /* Payload size is the lesser of what our speed supports and what * our host supports. */ - payload = min(sbp2_speedto_max_payload[scsi_id->speed_code], + payload = min(sbp2_speedto_max_payload[lu->speed_code], (u8) (hi->host->csr.max_rec - 1)); /* If physical DMA is off, work around limitation in ohci1394: * packet size must not exceed PAGE_SIZE */ - if (scsi_id->ne->host->low_addr_space < (1ULL << 32)) + if (lu->ne->host->low_addr_space < (1ULL << 32)) while (SBP2_PAYLOAD_TO_BYTES(payload) + 24 > PAGE_SIZE && payload) payload--; SBP2_INFO("Node " NODE_BUS_FMT ": Max speed [%s] - Max payload [%u]", - NODE_BUS_ARGS(hi->host, scsi_id->ne->nodeid), - hpsb_speedto_str[scsi_id->speed_code], + NODE_BUS_ARGS(hi->host, lu->ne->nodeid), + hpsb_speedto_str[lu->speed_code], SBP2_PAYLOAD_TO_BYTES(payload)); - scsi_id->max_payload_size = payload; + lu->max_payload_size = payload; return 0; } -static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) +static int sbp2_agent_reset(struct sbp2_lu *lu, int wait) { quadlet_t data; u64 addr; int retval; unsigned long flags; - /* cancel_delayed_work(&scsi_id->protocol_work); */ + /* cancel_delayed_work(&lu->protocol_work); */ if (wait) flush_scheduled_work(); data = ntohl(SBP2_AGENT_RESET_DATA); - addr = scsi_id->command_block_agent_addr + SBP2_AGENT_RESET_OFFSET; + addr = lu->command_block_agent_addr + SBP2_AGENT_RESET_OFFSET; if (wait) - retval = hpsb_node_write(scsi_id->ne, addr, &data, 4); + retval = hpsb_node_write(lu->ne, addr, &data, 4); else - retval = sbp2util_node_write_no_wait(scsi_id->ne, addr, &data, 4); + retval = sbp2util_node_write_no_wait(lu->ne, addr, &data, 4); if (retval < 0) { SBP2_ERR("hpsb_node_write failed.\n"); @@ -1446,22 +1426,22 @@ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) } /* make sure that the ORB_POINTER is written on next command */ - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - scsi_id->last_orb = NULL; - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + lu->last_orb = NULL; + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); return 0; } static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, struct sbp2_fwhost_info *hi, - struct sbp2_command_info *command, + struct sbp2_command_info *cmd, unsigned int scsi_use_sg, struct scatterlist *sgpnt, u32 orb_direction, enum dma_data_direction dma_dir) { - command->dma_dir = dma_dir; + cmd->dma_dir = dma_dir; orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id); orb->misc |= ORB_SET_DIRECTION(orb_direction); @@ -1469,31 +1449,29 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, if ((scsi_use_sg == 1) && (sgpnt[0].length <= SBP2_MAX_SG_ELEMENT_LENGTH)) { - command->dma_size = sgpnt[0].length; - command->dma_type = CMD_DMA_PAGE; - command->cmd_dma = pci_map_page(hi->host->pdev, - sgpnt[0].page, - sgpnt[0].offset, - command->dma_size, - command->dma_dir); + cmd->dma_size = sgpnt[0].length; + cmd->dma_type = CMD_DMA_PAGE; + cmd->cmd_dma = pci_map_page(hi->host->pdev, + sgpnt[0].page, sgpnt[0].offset, + cmd->dma_size, cmd->dma_dir); - orb->data_descriptor_lo = command->cmd_dma; - orb->misc |= ORB_SET_DATA_SIZE(command->dma_size); + orb->data_descriptor_lo = cmd->cmd_dma; + orb->misc |= ORB_SET_DATA_SIZE(cmd->dma_size); } else { struct sbp2_unrestricted_page_table *sg_element = - &command->scatter_gather_element[0]; + &cmd->scatter_gather_element[0]; u32 sg_count, sg_len; dma_addr_t sg_addr; int i, count = pci_map_sg(hi->host->pdev, sgpnt, scsi_use_sg, dma_dir); - command->dma_size = scsi_use_sg; - command->sge_buffer = sgpnt; + cmd->dma_size = scsi_use_sg; + cmd->sge_buffer = sgpnt; /* use page tables (s/g) */ orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1); - orb->data_descriptor_lo = command->sge_dma; + orb->data_descriptor_lo = cmd->sge_dma; /* loop through and fill out our SBP-2 page tables * (and split up anything too large) */ @@ -1519,25 +1497,25 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, orb->misc |= ORB_SET_DATA_SIZE(sg_count); sbp2util_cpu_to_be32_buffer(sg_element, - (sizeof(struct sbp2_unrestricted_page_table)) * - sg_count); + (sizeof(struct sbp2_unrestricted_page_table)) * + sg_count); } } static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, struct sbp2_fwhost_info *hi, - struct sbp2_command_info *command, + struct sbp2_command_info *cmd, struct scatterlist *sgpnt, u32 orb_direction, unsigned int scsi_request_bufflen, void *scsi_request_buffer, enum dma_data_direction dma_dir) { - command->dma_dir = dma_dir; - command->dma_size = scsi_request_bufflen; - command->dma_type = CMD_DMA_SINGLE; - command->cmd_dma = pci_map_single(hi->host->pdev, scsi_request_buffer, - command->dma_size, command->dma_dir); + cmd->dma_dir = dma_dir; + cmd->dma_size = scsi_request_bufflen; + cmd->dma_type = CMD_DMA_SINGLE; + cmd->cmd_dma = pci_map_single(hi->host->pdev, scsi_request_buffer, + cmd->dma_size, cmd->dma_dir); orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id); orb->misc |= ORB_SET_DIRECTION(orb_direction); @@ -1545,24 +1523,24 @@ static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, * (but check for transfers larger than 64K) */ if (scsi_request_bufflen <= SBP2_MAX_SG_ELEMENT_LENGTH) { - orb->data_descriptor_lo = command->cmd_dma; + orb->data_descriptor_lo = cmd->cmd_dma; orb->misc |= ORB_SET_DATA_SIZE(scsi_request_bufflen); } else { /* The buffer is too large. Turn this into page tables. */ struct sbp2_unrestricted_page_table *sg_element = - &command->scatter_gather_element[0]; + &cmd->scatter_gather_element[0]; u32 sg_count, sg_len; dma_addr_t sg_addr; - orb->data_descriptor_lo = command->sge_dma; + orb->data_descriptor_lo = cmd->sge_dma; orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1); /* fill out our SBP-2 page tables; split up the large buffer */ sg_count = 0; sg_len = scsi_request_bufflen; - sg_addr = command->cmd_dma; + sg_addr = cmd->cmd_dma; while (sg_len) { sg_element[sg_count].segment_base_lo = sg_addr; if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) { @@ -1581,22 +1559,22 @@ static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, orb->misc |= ORB_SET_DATA_SIZE(sg_count); sbp2util_cpu_to_be32_buffer(sg_element, - (sizeof(struct sbp2_unrestricted_page_table)) * - sg_count); + (sizeof(struct sbp2_unrestricted_page_table)) * + sg_count); } } -static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, - struct sbp2_command_info *command, +static void sbp2_create_command_orb(struct sbp2_lu *lu, + struct sbp2_command_info *cmd, unchar *scsi_cmd, unsigned int scsi_use_sg, unsigned int scsi_request_bufflen, void *scsi_request_buffer, enum dma_data_direction dma_dir) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; struct scatterlist *sgpnt = (struct scatterlist *)scsi_request_buffer; - struct sbp2_command_orb *command_orb = &command->command_orb; + struct sbp2_command_orb *orb = &cmd->command_orb; u32 orb_direction; /* @@ -1607,11 +1585,11 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, * that data_size becomes the number of s/g elements, and * page_size should be zero (for unrestricted). */ - command_orb->next_ORB_hi = ORB_SET_NULL_PTR(1); - command_orb->next_ORB_lo = 0x0; - command_orb->misc = ORB_SET_MAX_PAYLOAD(scsi_id->max_payload_size); - command_orb->misc |= ORB_SET_SPEED(scsi_id->speed_code); - command_orb->misc |= ORB_SET_NOTIFY(1); + orb->next_ORB_hi = ORB_SET_NULL_PTR(1); + orb->next_ORB_lo = 0x0; + orb->misc = ORB_SET_MAX_PAYLOAD(lu->max_payload_size); + orb->misc |= ORB_SET_SPEED(lu->speed_code); + orb->misc |= ORB_SET_NOTIFY(1); if (dma_dir == DMA_NONE) orb_direction = ORB_DIRECTION_NO_DATA_TRANSFER; @@ -1626,46 +1604,45 @@ static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id, /* set up our page table stuff */ if (orb_direction == ORB_DIRECTION_NO_DATA_TRANSFER) { - command_orb->data_descriptor_hi = 0x0; - command_orb->data_descriptor_lo = 0x0; - command_orb->misc |= ORB_SET_DIRECTION(1); + orb->data_descriptor_hi = 0x0; + orb->data_descriptor_lo = 0x0; + orb->misc |= ORB_SET_DIRECTION(1); } else if (scsi_use_sg) - sbp2_prep_command_orb_sg(command_orb, hi, command, scsi_use_sg, - sgpnt, orb_direction, dma_dir); + sbp2_prep_command_orb_sg(orb, hi, cmd, scsi_use_sg, sgpnt, + orb_direction, dma_dir); else - sbp2_prep_command_orb_no_sg(command_orb, hi, command, sgpnt, - orb_direction, scsi_request_bufflen, + sbp2_prep_command_orb_no_sg(orb, hi, cmd, sgpnt, orb_direction, + scsi_request_bufflen, scsi_request_buffer, dma_dir); - sbp2util_cpu_to_be32_buffer(command_orb, sizeof(struct sbp2_command_orb)); + sbp2util_cpu_to_be32_buffer(orb, sizeof(*orb)); - memset(command_orb->cdb, 0, 12); - memcpy(command_orb->cdb, scsi_cmd, COMMAND_SIZE(*scsi_cmd)); + memset(orb->cdb, 0, 12); + memcpy(orb->cdb, scsi_cmd, COMMAND_SIZE(*scsi_cmd)); } -static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, - struct sbp2_command_info *command) +static void sbp2_link_orb_command(struct sbp2_lu *lu, + struct sbp2_command_info *cmd) { - struct sbp2_fwhost_info *hi = scsi_id->hi; - struct sbp2_command_orb *command_orb = &command->command_orb; + struct sbp2_fwhost_info *hi = lu->hi; struct sbp2_command_orb *last_orb; dma_addr_t last_orb_dma; - u64 addr = scsi_id->command_block_agent_addr; + u64 addr = lu->command_block_agent_addr; quadlet_t data[2]; size_t length; unsigned long flags; - pci_dma_sync_single_for_device(hi->host->pdev, command->command_orb_dma, + pci_dma_sync_single_for_device(hi->host->pdev, cmd->command_orb_dma, sizeof(struct sbp2_command_orb), PCI_DMA_TODEVICE); - pci_dma_sync_single_for_device(hi->host->pdev, command->sge_dma, - sizeof(command->scatter_gather_element), + pci_dma_sync_single_for_device(hi->host->pdev, cmd->sge_dma, + sizeof(cmd->scatter_gather_element), PCI_DMA_BIDIRECTIONAL); /* check to see if there are any previous orbs to use */ - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - last_orb = scsi_id->last_orb; - last_orb_dma = scsi_id->last_orb_dma; + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + last_orb = lu->last_orb; + last_orb_dma = lu->last_orb_dma; if (!last_orb) { /* * last_orb == NULL means: We know that the target's fetch agent @@ -1673,7 +1650,7 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, */ addr += SBP2_ORB_POINTER_OFFSET; data[0] = ORB_SET_NODE_ID(hi->host->node_id); - data[1] = command->command_orb_dma; + data[1] = cmd->command_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); length = 8; } else { @@ -1687,7 +1664,7 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, pci_dma_sync_single_for_cpu(hi->host->pdev, last_orb_dma, sizeof(struct sbp2_command_orb), PCI_DMA_TODEVICE); - last_orb->next_ORB_lo = cpu_to_be32(command->command_orb_dma); + last_orb->next_ORB_lo = cpu_to_be32(cmd->command_orb_dma); wmb(); /* Tells hardware that this pointer is valid */ last_orb->next_ORB_hi = 0; @@ -1698,11 +1675,11 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, data[0] = 0; length = 4; } - scsi_id->last_orb = command_orb; - scsi_id->last_orb_dma = command->command_orb_dma; - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + lu->last_orb = &cmd->command_orb; + lu->last_orb_dma = cmd->command_orb_dma; + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); - if (sbp2util_node_write_no_wait(scsi_id->ne, addr, data, length)) { + if (sbp2util_node_write_no_wait(lu->ne, addr, data, length)) { /* * sbp2util_node_write_no_wait failed. We certainly ran out * of transaction labels, perhaps just because there were no @@ -1711,31 +1688,30 @@ static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id, * the workqueue job will sleep to guaranteedly get a tlabel. * We do not accept new commands until the job is over. */ - scsi_block_requests(scsi_id->scsi_host); - PREPARE_WORK(&scsi_id->protocol_work, + scsi_block_requests(lu->shost); + PREPARE_WORK(&lu->protocol_work, last_orb ? sbp2util_write_doorbell: sbp2util_write_orb_pointer /* */); - schedule_work(&scsi_id->protocol_work); + schedule_work(&lu->protocol_work); } } -static int sbp2_send_command(struct scsi_id_instance_data *scsi_id, - struct scsi_cmnd *SCpnt, +static int sbp2_send_command(struct sbp2_lu *lu, struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) { - unchar *cmd = (unchar *) SCpnt->cmnd; + unchar *scsi_cmd = (unchar *)SCpnt->cmnd; unsigned int request_bufflen = SCpnt->request_bufflen; - struct sbp2_command_info *command; + struct sbp2_command_info *cmd; - command = sbp2util_allocate_command_orb(scsi_id, SCpnt, done); - if (!command) + cmd = sbp2util_allocate_command_orb(lu, SCpnt, done); + if (!cmd) return -EIO; - sbp2_create_command_orb(scsi_id, command, cmd, SCpnt->use_sg, + sbp2_create_command_orb(lu, cmd, scsi_cmd, SCpnt->use_sg, request_bufflen, SCpnt->request_buffer, SCpnt->sc_data_direction); - sbp2_link_orb_command(scsi_id, command); + sbp2_link_orb_command(lu, cmd); return 0; } @@ -1743,7 +1719,8 @@ static int sbp2_send_command(struct scsi_id_instance_data *scsi_id, /* * Translates SBP-2 status into SCSI sense data for check conditions */ -static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense_data) +static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, + unchar *sense_data) { /* OK, it's pretty ugly... ;-) */ sense_data[0] = 0x70; @@ -1771,11 +1748,11 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, size_t length, u16 fl) { struct sbp2_fwhost_info *hi; - struct scsi_id_instance_data *scsi_id = NULL, *scsi_id_tmp; + struct sbp2_lu *lu = NULL, *lu_tmp; struct scsi_cmnd *SCpnt = NULL; struct sbp2_status_block *sb; u32 scsi_status = SBP2_SCSI_STATUS_GOOD; - struct sbp2_command_info *command; + struct sbp2_command_info *cmd; unsigned long flags; if (unlikely(length < 8 || length > sizeof(struct sbp2_status_block))) { @@ -1793,49 +1770,50 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, } /* Find the unit which wrote the status. */ - list_for_each_entry(scsi_id_tmp, &hi->scsi_ids, scsi_list) { - if (scsi_id_tmp->ne->nodeid == nodeid && - scsi_id_tmp->status_fifo_addr == addr) { - scsi_id = scsi_id_tmp; + list_for_each_entry(lu_tmp, &hi->logical_units, lu_list) { + if (lu_tmp->ne->nodeid == nodeid && + lu_tmp->status_fifo_addr == addr) { + lu = lu_tmp; break; } } - if (unlikely(!scsi_id)) { - SBP2_ERR("scsi_id is NULL - device is gone?"); + if (unlikely(!lu)) { + SBP2_ERR("lu is NULL - device is gone?"); return RCODE_ADDRESS_ERROR; } - /* Put response into scsi_id status fifo buffer. The first two bytes + /* Put response into lu status fifo buffer. The first two bytes * come in big endian bit order. Often the target writes only a * truncated status block, minimally the first two quadlets. The rest * is implied to be zeros. */ - sb = &scsi_id->status_block; + sb = &lu->status_block; memset(sb->command_set_dependent, 0, sizeof(sb->command_set_dependent)); memcpy(sb, data, length); sbp2util_be32_to_cpu_buffer(sb, 8); /* Ignore unsolicited status. Handle command ORB status. */ if (unlikely(STATUS_GET_SRC(sb->ORB_offset_hi_misc) == 2)) - command = NULL; + cmd = NULL; else - command = sbp2util_find_command_for_orb(scsi_id, - sb->ORB_offset_lo); - if (command) { - pci_dma_sync_single_for_cpu(hi->host->pdev, command->command_orb_dma, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - pci_dma_sync_single_for_cpu(hi->host->pdev, command->sge_dma, - sizeof(command->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); + cmd = sbp2util_find_command_for_orb(lu, sb->ORB_offset_lo); + if (cmd) { + pci_dma_sync_single_for_cpu(hi->host->pdev, + cmd->command_orb_dma, + sizeof(struct sbp2_command_orb), + PCI_DMA_TODEVICE); + pci_dma_sync_single_for_cpu(hi->host->pdev, + cmd->sge_dma, + sizeof(cmd->scatter_gather_element), + PCI_DMA_BIDIRECTIONAL); /* Grab SCSI command pointers and check status. */ /* * FIXME: If the src field in the status is 1, the ORB DMA must * not be reused until status for a subsequent ORB is received. */ - SCpnt = command->Current_SCpnt; - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - sbp2util_mark_command_completed(scsi_id, command); - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + SCpnt = cmd->Current_SCpnt; + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + sbp2util_mark_command_completed(lu, cmd); + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); if (SCpnt) { u32 h = sb->ORB_offset_hi_misc; @@ -1855,7 +1833,7 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, (unchar *)sb, SCpnt->sense_buffer); if (STATUS_TEST_DEAD(h)) - sbp2_agent_reset(scsi_id, 0); + sbp2_agent_reset(lu, 0); } /* Check here to see if there are no commands in-use. If there @@ -1864,25 +1842,25 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, * last_orb so that next time we write directly to the * ORB_POINTER register. That way the fetch agent does not need * to refetch the next_ORB. */ - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - if (list_empty(&scsi_id->cmd_orb_inuse)) - scsi_id->last_orb = NULL; - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + if (list_empty(&lu->cmd_orb_inuse)) + lu->last_orb = NULL; + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); } else { /* It's probably status after a management request. */ - if ((sb->ORB_offset_lo == scsi_id->reconnect_orb_dma) || - (sb->ORB_offset_lo == scsi_id->login_orb_dma) || - (sb->ORB_offset_lo == scsi_id->query_logins_orb_dma) || - (sb->ORB_offset_lo == scsi_id->logout_orb_dma)) { - scsi_id->access_complete = 1; + if ((sb->ORB_offset_lo == lu->reconnect_orb_dma) || + (sb->ORB_offset_lo == lu->login_orb_dma) || + (sb->ORB_offset_lo == lu->query_logins_orb_dma) || + (sb->ORB_offset_lo == lu->logout_orb_dma)) { + lu->access_complete = 1; wake_up_interruptible(&sbp2_access_wq); } } if (SCpnt) - sbp2scsi_complete_command(scsi_id, scsi_status, SCpnt, - command->Current_done); + sbp2scsi_complete_command(lu, scsi_status, SCpnt, + cmd->Current_done); return RCODE_COMPLETE; } @@ -1893,15 +1871,14 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) { - struct scsi_id_instance_data *scsi_id = - (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0]; + struct sbp2_lu *lu = (struct sbp2_lu *)SCpnt->device->host->hostdata[0]; struct sbp2_fwhost_info *hi; int result = DID_NO_CONNECT << 16; - if (unlikely(!sbp2util_node_is_available(scsi_id))) + if (unlikely(!sbp2util_node_is_available(lu))) goto done; - hi = scsi_id->hi; + hi = lu->hi; if (unlikely(!hi)) { SBP2_ERR("sbp2_fwhost_info is NULL - this is bad!"); @@ -1916,13 +1893,15 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, /* handle the request sense command here (auto-request sense) */ if (SCpnt->cmnd[0] == REQUEST_SENSE) { - memcpy(SCpnt->request_buffer, SCpnt->sense_buffer, SCpnt->request_bufflen); + memcpy(SCpnt->request_buffer, SCpnt->sense_buffer, + SCpnt->request_bufflen); memset(SCpnt->sense_buffer, 0, sizeof(SCpnt->sense_buffer)); - sbp2scsi_complete_command(scsi_id, SBP2_SCSI_STATUS_GOOD, SCpnt, done); + sbp2scsi_complete_command(lu, SBP2_SCSI_STATUS_GOOD, SCpnt, + done); return 0; } - if (unlikely(!hpsb_node_entry_valid(scsi_id->ne))) { + if (unlikely(!hpsb_node_entry_valid(lu->ne))) { SBP2_ERR("Bus reset in progress - rejecting command"); result = DID_BUS_BUSY << 16; goto done; @@ -1936,9 +1915,10 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt, goto done; } - if (sbp2_send_command(scsi_id, SCpnt, done)) { + if (sbp2_send_command(lu, SCpnt, done)) { SBP2_ERR("Error sending SCSI command"); - sbp2scsi_complete_command(scsi_id, SBP2_SCSI_STATUS_SELECTION_TIMEOUT, + sbp2scsi_complete_command(lu, + SBP2_SCSI_STATUS_SELECTION_TIMEOUT, SCpnt, done); } return 0; @@ -1949,31 +1929,31 @@ done: return 0; } -static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id, - u32 status) +static void sbp2scsi_complete_all_commands(struct sbp2_lu *lu, u32 status) { - struct sbp2_fwhost_info *hi = scsi_id->hi; + struct sbp2_fwhost_info *hi = lu->hi; struct list_head *lh; - struct sbp2_command_info *command; + struct sbp2_command_info *cmd; unsigned long flags; - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - while (!list_empty(&scsi_id->cmd_orb_inuse)) { - lh = scsi_id->cmd_orb_inuse.next; - command = list_entry(lh, struct sbp2_command_info, list); - pci_dma_sync_single_for_cpu(hi->host->pdev, command->command_orb_dma, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - pci_dma_sync_single_for_cpu(hi->host->pdev, command->sge_dma, - sizeof(command->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); - sbp2util_mark_command_completed(scsi_id, command); - if (command->Current_SCpnt) { - command->Current_SCpnt->result = status << 16; - command->Current_done(command->Current_SCpnt); + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + while (!list_empty(&lu->cmd_orb_inuse)) { + lh = lu->cmd_orb_inuse.next; + cmd = list_entry(lh, struct sbp2_command_info, list); + pci_dma_sync_single_for_cpu(hi->host->pdev, + cmd->command_orb_dma, + sizeof(struct sbp2_command_orb), + PCI_DMA_TODEVICE); + pci_dma_sync_single_for_cpu(hi->host->pdev, cmd->sge_dma, + sizeof(cmd->scatter_gather_element), + PCI_DMA_BIDIRECTIONAL); + sbp2util_mark_command_completed(lu, cmd); + if (cmd->Current_SCpnt) { + cmd->Current_SCpnt->result = status << 16; + cmd->Current_done(cmd->Current_SCpnt); } } - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); return; } @@ -1981,8 +1961,8 @@ static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id /* * Complete a regular SCSI command. Can be called in atomic context. */ -static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, - u32 scsi_status, struct scsi_cmnd *SCpnt, +static void sbp2scsi_complete_command(struct sbp2_lu *lu, u32 scsi_status, + struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) { if (!SCpnt) { @@ -2025,7 +2005,7 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, /* If a bus reset is in progress and there was an error, complete * the command as busy so that it will get retried. */ - if (!hpsb_node_entry_valid(scsi_id->ne) + if (!hpsb_node_entry_valid(lu->ne) && (scsi_status != SBP2_SCSI_STATUS_GOOD)) { SBP2_ERR("Completing command with busy (bus reset)"); SCpnt->result = DID_BUS_BUSY << 16; @@ -2037,36 +2017,34 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id, static int sbp2scsi_slave_alloc(struct scsi_device *sdev) { - struct scsi_id_instance_data *scsi_id = - (struct scsi_id_instance_data *)sdev->host->hostdata[0]; + struct sbp2_lu *lu = (struct sbp2_lu *)sdev->host->hostdata[0]; - scsi_id->sdev = sdev; + lu->sdev = sdev; sdev->allow_restart = 1; - if (scsi_id->workarounds & SBP2_WORKAROUND_INQUIRY_36) + if (lu->workarounds & SBP2_WORKAROUND_INQUIRY_36) sdev->inquiry_len = 36; return 0; } static int sbp2scsi_slave_configure(struct scsi_device *sdev) { - struct scsi_id_instance_data *scsi_id = - (struct scsi_id_instance_data *)sdev->host->hostdata[0]; + struct sbp2_lu *lu = (struct sbp2_lu *)sdev->host->hostdata[0]; blk_queue_dma_alignment(sdev->request_queue, (512 - 1)); sdev->use_10_for_rw = 1; if (sdev->type == TYPE_DISK && - scsi_id->workarounds & SBP2_WORKAROUND_MODE_SENSE_8) + lu->workarounds & SBP2_WORKAROUND_MODE_SENSE_8) sdev->skip_ms_page_8 = 1; - if (scsi_id->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) + if (lu->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) sdev->fix_capacity = 1; return 0; } static void sbp2scsi_slave_destroy(struct scsi_device *sdev) { - ((struct scsi_id_instance_data *)sdev->host->hostdata[0])->sdev = NULL; + ((struct sbp2_lu *)sdev->host->hostdata[0])->sdev = NULL; return; } @@ -2076,39 +2054,38 @@ static void sbp2scsi_slave_destroy(struct scsi_device *sdev) */ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) { - struct scsi_id_instance_data *scsi_id = - (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0]; - struct sbp2_fwhost_info *hi = scsi_id->hi; - struct sbp2_command_info *command; + struct sbp2_lu *lu = (struct sbp2_lu *)SCpnt->device->host->hostdata[0]; + struct sbp2_fwhost_info *hi = lu->hi; + struct sbp2_command_info *cmd; unsigned long flags; SBP2_INFO("aborting sbp2 command"); scsi_print_command(SCpnt); - if (sbp2util_node_is_available(scsi_id)) { - sbp2_agent_reset(scsi_id, 1); + if (sbp2util_node_is_available(lu)) { + sbp2_agent_reset(lu, 1); /* Return a matching command structure to the free pool. */ - spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags); - command = sbp2util_find_command_for_SCpnt(scsi_id, SCpnt); - if (command) { + spin_lock_irqsave(&lu->cmd_orb_lock, flags); + cmd = sbp2util_find_command_for_SCpnt(lu, SCpnt); + if (cmd) { pci_dma_sync_single_for_cpu(hi->host->pdev, - command->command_orb_dma, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); + cmd->command_orb_dma, + sizeof(struct sbp2_command_orb), + PCI_DMA_TODEVICE); pci_dma_sync_single_for_cpu(hi->host->pdev, - command->sge_dma, - sizeof(command->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); - sbp2util_mark_command_completed(scsi_id, command); - if (command->Current_SCpnt) { - command->Current_SCpnt->result = DID_ABORT << 16; - command->Current_done(command->Current_SCpnt); + cmd->sge_dma, + sizeof(cmd->scatter_gather_element), + PCI_DMA_BIDIRECTIONAL); + sbp2util_mark_command_completed(lu, cmd); + if (cmd->Current_SCpnt) { + cmd->Current_SCpnt->result = DID_ABORT << 16; + cmd->Current_done(cmd->Current_SCpnt); } } - spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags); + spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); - sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY); + sbp2scsi_complete_all_commands(lu, DID_BUS_BUSY); } return SUCCESS; @@ -2119,14 +2096,13 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) */ static int sbp2scsi_reset(struct scsi_cmnd *SCpnt) { - struct scsi_id_instance_data *scsi_id = - (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0]; + struct sbp2_lu *lu = (struct sbp2_lu *)SCpnt->device->host->hostdata[0]; SBP2_INFO("reset requested"); - if (sbp2util_node_is_available(scsi_id)) { + if (sbp2util_node_is_available(lu)) { SBP2_INFO("generating sbp2 fetch agent reset"); - sbp2_agent_reset(scsi_id, 1); + sbp2_agent_reset(lu, 1); } return SUCCESS; @@ -2137,16 +2113,16 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, char *buf) { struct scsi_device *sdev; - struct scsi_id_instance_data *scsi_id; + struct sbp2_lu *lu; if (!(sdev = to_scsi_device(dev))) return 0; - if (!(scsi_id = (struct scsi_id_instance_data *)sdev->host->hostdata[0])) + if (!(lu = (struct sbp2_lu *)sdev->host->hostdata[0])) return 0; - return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)scsi_id->ne->guid, - scsi_id->ud->id, ORB_SET_LUN(scsi_id->lun)); + return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)lu->ne->guid, + lu->ud->id, ORB_SET_LUN(lu->lun)); } MODULE_AUTHOR("Ben Collins "); diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index 8902a46..38ca119 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -256,7 +256,8 @@ struct sbp2_command_info { void (*Current_done)(struct scsi_cmnd *); /* Also need s/g structure for each sbp2 command */ - struct sbp2_unrestricted_page_table scatter_gather_element[SG_ALL] ____cacheline_aligned; + struct sbp2_unrestricted_page_table + scatter_gather_element[SG_ALL] ____cacheline_aligned; dma_addr_t sge_dma ____cacheline_aligned; void *sge_buffer; dma_addr_t cmd_dma; @@ -268,11 +269,11 @@ struct sbp2_command_info { /* Per FireWire host */ struct sbp2_fwhost_info { struct hpsb_host *host; - struct list_head scsi_ids; + struct list_head logical_units; }; /* Per logical unit */ -struct scsi_id_instance_data { +struct sbp2_lu { /* Operation request blocks */ struct sbp2_command_orb *last_orb; dma_addr_t last_orb_dma; @@ -310,7 +311,7 @@ struct scsi_id_instance_data { /* Backlink to FireWire host; list of units attached to the host */ struct sbp2_fwhost_info *hi; - struct list_head scsi_list; + struct list_head lu_list; /* IEEE 1394 core's device representations */ struct node_entry *ne; @@ -318,7 +319,7 @@ struct scsi_id_instance_data { /* SCSI core's device representations */ struct scsi_device *sdev; - struct Scsi_Host *scsi_host; + struct Scsi_Host *shost; /* Device specific workarounds/brokeness */ unsigned workarounds; @@ -330,14 +331,14 @@ struct scsi_id_instance_data { struct work_struct protocol_work; }; -/* For use in scsi_id_instance_data.state */ +/* For use in sbp2_lu.state */ enum sbp2lu_state_types { SBP2LU_STATE_RUNNING, /* all normal */ SBP2LU_STATE_IN_RESET, /* between bus reset and reconnect */ SBP2LU_STATE_IN_SHUTDOWN /* when sbp2_remove was called */ }; -/* For use in scsi_id_instance_data.workarounds and in the corresponding +/* For use in sbp2_lu.workarounds and in the corresponding * module load parameter */ #define SBP2_WORKAROUND_128K_MAX_TRANS 0x1 #define SBP2_WORKAROUND_INQUIRY_36 0x2 -- cgit v1.1 From cd641f68d628e5c44350447d4b8d661991419e60 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: use list_move_tail() It's OK to reorder list_del() and sbp2util_free_command_dma() here. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index a7fb588..2b6d9a0 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -619,9 +619,8 @@ static void sbp2util_mark_command_completed( struct sbp2_lu *lu, struct sbp2_command_info *cmd) { - list_del(&cmd->list); sbp2util_free_command_dma(cmd); - list_add_tail(&cmd->list, &lu->cmd_orb_completed); + list_move_tail(&cmd->list, &lu->cmd_orb_completed); } /* -- cgit v1.1 From 2a533b179dcfe941ccbe30344d14f39f6d7098ae Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 2 Nov 2006 21:16:08 +0100 Subject: ieee1394: sbp2: update comment on things to do Some people actually look at those comments. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 2b6d9a0..187e26f 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -29,13 +29,27 @@ * driver. It also registers as a SCSI lower-level driver in order to accept * SCSI commands for transport using SBP-2. * - * You may access any attached SBP-2 storage devices as if they were SCSI - * devices (e.g. mount /dev/sda1, fdisk, mkfs, etc.). + * You may access any attached SBP-2 (usually storage devices) as regular + * SCSI devices. E.g. mount /dev/sda1, fdisk, mkfs, etc.. * - * Current Issues: + * See http://www.t10.org/drafts.htm#sbp2 for the final draft of the SBP-2 + * specification and for where to purchase the official standard. * - * - Error Handling: SCSI aborts and bus reset requests are handled somewhat - * but the code needs additional debugging. + * TODO: + * - look into possible improvements of the SCSI error handlers + * - handle Unit_Characteristics.mgt_ORB_timeout and .ORB_size + * - handle Logical_Unit_Number.ordered + * - handle src == 1 in status blocks + * - reimplement the DMA mapping in absence of physical DMA so that + * bus_to_virt is no longer required + * - debug the handling of absent physical DMA + * - replace CONFIG_IEEE1394_SBP2_PHYS_DMA by automatic detection + * (this is easy but depends on the previous two TODO items) + * - make the parameter serialize_io configurable per device + * - move all requests to fetch agent registers into non-atomic context, + * replace all usages of sbp2util_node_write_no_wait by true transactions + * - convert to generic DMA mapping API to eliminate dependency on PCI + * Grep for inline FIXME comments below. */ #include @@ -107,8 +121,6 @@ MODULE_PARM_DESC(max_speed, "Force max speed " * Set serialize_io to 1 if you'd like only one scsi command sent * down to us at a time (debugging). This might be necessary for very * badly behaved sbp2 devices. - * - * TODO: Make this configurable per device. */ static int sbp2_serialize_io = 1; module_param_named(serialize_io, sbp2_serialize_io, int, 0444); -- cgit v1.1 From 58272c1c0330f5f899f130d45ce845ca085de044 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 4 Nov 2006 09:55:33 +0100 Subject: ieee1394: sbp2: wrap two functions into one Move the body of a function into its only caller. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 187e26f..5d3b96e 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -591,18 +591,14 @@ static struct sbp2_command_info *sbp2util_allocate_command_orb( return cmd; } -static void sbp2util_free_command_dma(struct sbp2_command_info *cmd) +/* + * Unmaps the DMAs of a command and moves the command to the completed ORB list. + * Must be called with lu->cmd_orb_lock held. + */ +static void sbp2util_mark_command_completed(struct sbp2_lu *lu, + struct sbp2_command_info *cmd) { - struct sbp2_lu *lu = (struct sbp2_lu *) - cmd->Current_SCpnt->device->host->hostdata[0]; - struct hpsb_host *host; - - if (!lu) { - SBP2_ERR("%s: lu == NULL", __FUNCTION__); - return; - } - - host = lu->ud->ne->host; + struct hpsb_host *host = lu->ud->ne->host; if (cmd->cmd_dma) { if (cmd->dma_type == CMD_DMA_SINGLE) @@ -615,23 +611,11 @@ static void sbp2util_free_command_dma(struct sbp2_command_info *cmd) cmd->dma_type = CMD_DMA_NONE; cmd->cmd_dma = 0; } - if (cmd->sge_buffer) { pci_unmap_sg(host->pdev, cmd->sge_buffer, cmd->dma_size, cmd->dma_dir); cmd->sge_buffer = NULL; } -} - -/* - * This function moves a command to the completed orb list. - * Must be called with lu->cmd_orb_lock held. - */ -static void sbp2util_mark_command_completed( - struct sbp2_lu *lu, - struct sbp2_command_info *cmd) -{ - sbp2util_free_command_dma(cmd); list_move_tail(&cmd->list, &lu->cmd_orb_completed); } -- cgit v1.1 From 48cfae44b4d6c7ca843d611a93ed2f94b59bcb38 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 11 Nov 2006 00:22:35 +0100 Subject: ieee1394: ohci1394: add PPC_PMAC platform code to driver probe Fixes http://bugzilla.kernel.org/show_bug.cgi?id=7431 iBook G3 threw a machine check exception and put the display backlight to full brightness after ohci1394 was unloaded and reloaded. Signed-off-by: Stefan Richter --- drivers/ieee1394/ohci1394.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index b8e922b..453d0be 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c @@ -3215,6 +3215,19 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, struct ti_ohci *ohci; /* shortcut to currently handled device */ resource_size_t ohci_base; +#ifdef CONFIG_PPC_PMAC + /* Necessary on some machines if ohci1394 was loaded/ unloaded before */ + if (machine_is(powermac)) { + struct device_node *of_node = pci_device_to_OF_node(dev); + + if (of_node) { + pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, of_node, + 0, 1); + pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 1); + } + } +#endif /* CONFIG_PPC_PMAC */ + if (pci_enable_device(dev)) FAIL(-ENXIO, "Failed to enable OHCI hardware"); pci_set_master(dev); @@ -3503,10 +3516,8 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) #endif #ifdef CONFIG_PPC_PMAC - /* On UniNorth, power down the cable and turn off the chip - * clock when the module is removed to save power on - * laptops. Turning it back ON is done by the arch code when - * pci_enable_device() is called */ + /* On UniNorth, power down the cable and turn off the chip clock + * to save power on laptops */ { struct device_node* of_node; -- cgit v1.1 From 5370f1f5e94f1734f0706044bfb95007ea90fb23 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 11 Nov 2006 00:23:50 +0100 Subject: ieee1394: ohci1394: reformat PPC_PMAC platform code Adjust whitespace and line lengths Signed-off-by: Stefan Richter --- drivers/ieee1394/ohci1394.c | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index 453d0be..3c9dc7d 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c @@ -3218,12 +3218,11 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, #ifdef CONFIG_PPC_PMAC /* Necessary on some machines if ohci1394 was loaded/ unloaded before */ if (machine_is(powermac)) { - struct device_node *of_node = pci_device_to_OF_node(dev); + struct device_node *ofn = pci_device_to_OF_node(dev); - if (of_node) { - pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, of_node, - 0, 1); - pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 1); + if (ofn) { + pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 1); + pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); } } #endif /* CONFIG_PPC_PMAC */ @@ -3519,12 +3518,11 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) /* On UniNorth, power down the cable and turn off the chip clock * to save power on laptops */ { - struct device_node* of_node; + struct device_node* ofn = pci_device_to_OF_node(ohci->dev); - of_node = pci_device_to_OF_node(ohci->dev); - if (of_node) { - pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0); - pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, of_node, 0, 0); + if (ofn) { + pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); + pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0); } } #endif /* CONFIG_PPC_PMAC */ @@ -3584,12 +3582,10 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) /* PowerMac suspend code comes last */ #ifdef CONFIG_PPC_PMAC if (machine_is(powermac)) { - struct device_node *of_node; + struct device_node *ofn = pci_device_to_OF_node(pdev); - /* Disable 1394 */ - of_node = pci_device_to_OF_node (pdev); - if (of_node) - pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0); + if (ofn) + pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); } #endif /* CONFIG_PPC_PMAC */ @@ -3611,12 +3607,10 @@ static int ohci1394_pci_resume(struct pci_dev *pdev) /* PowerMac resume code comes first */ #ifdef CONFIG_PPC_PMAC if (machine_is(powermac)) { - struct device_node *of_node; + struct device_node *ofn = pci_device_to_OF_node(pdev); - /* Re-enable 1394 */ - of_node = pci_device_to_OF_node (pdev); - if (of_node) - pmac_call_feature (PMAC_FTR_1394_ENABLE, of_node, 0, 1); + if (ofn) + pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); } #endif /* CONFIG_PPC_PMAC */ -- cgit v1.1 From 63cca59e89892497e95e1e9c7156d3345fb7e2e8 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 11 Nov 2006 00:26:24 +0100 Subject: ieee1394: ohci1394: call PMac code in shutdown only for proper machines There has been an if(...) missing, for ages. Signed-off-by: Stefan Richter --- drivers/ieee1394/ohci1394.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index 3c9dc7d..628130a 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c @@ -3517,7 +3517,7 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) #ifdef CONFIG_PPC_PMAC /* On UniNorth, power down the cable and turn off the chip clock * to save power on laptops */ - { + if (machine_is(powermac)) { struct device_node* ofn = pci_device_to_OF_node(ohci->dev); if (ofn) { -- cgit v1.1 From 9868e0ec03fd4ac9cb3943e5dae0ad6a14faa5ff Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Mon, 20 Nov 2006 00:05:05 +0100 Subject: ieee1394: raw1394: defer feature removal of old isoch interface Known to be affected: - libdc1394: prefers video1394 for now, old-style raw1394 support might be dropped eventually - OpenH323 PWLib, AVC video input module: uses libraw1394's old API Signed-off-by: Stefan Richter --- drivers/ieee1394/raw1394.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'drivers') diff --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c index bf71e06..4889383d 100644 --- a/drivers/ieee1394/raw1394.c +++ b/drivers/ieee1394/raw1394.c @@ -99,6 +99,21 @@ static struct hpsb_address_ops arm_ops = { static void queue_complete_cb(struct pending_request *req); +#include +static void print_old_iso_deprecation(void) +{ + static pid_t p; + + if (p == current->pid) + return; + p = current->pid; + printk(KERN_WARNING "raw1394: WARNING - Program \"%s\" uses unsupported" + " isochronous request types which will be removed in a next" + " kernel release\n", current->comm); + printk(KERN_WARNING "raw1394: Update your software to use libraw1394's" + " newer interface\n"); +} + static struct pending_request *__alloc_pending_request(gfp_t flags) { struct pending_request *req; @@ -2292,6 +2307,7 @@ static int state_connected(struct file_info *fi, struct pending_request *req) return sizeof(struct raw1394_request); case RAW1394_REQ_ISO_SEND: + print_old_iso_deprecation(); return handle_iso_send(fi, req, node); case RAW1394_REQ_ARM_REGISTER: @@ -2310,6 +2326,7 @@ static int state_connected(struct file_info *fi, struct pending_request *req) return reset_notification(fi, req); case RAW1394_REQ_ISO_LISTEN: + print_old_iso_deprecation(); handle_iso_listen(fi, req); return sizeof(struct raw1394_request); -- cgit v1.1 From 861646f52217cf42a0e2e6558d85bd1172ca1611 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Mon, 20 Nov 2006 00:07:26 +0100 Subject: ieee1394: dv1394: schedule for feature removal Signed-off-by: Stefan Richter --- drivers/ieee1394/Kconfig | 13 ++++--------- drivers/ieee1394/dv1394.c | 4 ++++ 2 files changed, 8 insertions(+), 9 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/Kconfig b/drivers/ieee1394/Kconfig index 672b92e..680da9e 100644 --- a/drivers/ieee1394/Kconfig +++ b/drivers/ieee1394/Kconfig @@ -161,17 +161,12 @@ config IEEE1394_ETH1394 MCAP, therefore multicast support is significantly limited. config IEEE1394_DV1394 - tristate "OHCI-DV I/O support" + tristate "OHCI-DV I/O support (deprecated)" depends on IEEE1394 && IEEE1394_OHCI1394 help - This driver allows you to transmit and receive DV (digital video) - streams on an OHCI-1394 card using a simple frame-oriented - interface. - - The user-space API for dv1394 is documented in dv1394.h. - - To compile this driver as a module, say M here: the - module will be called dv1394. + The dv1394 driver will be removed from Linux in a future release. + Its functionality is now provided by raw1394 together with libraries + such as libiec61883. config IEEE1394_RAWIO tristate "Raw IEEE1394 I/O support" diff --git a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c index d0e11c1..3bd78ef 100644 --- a/drivers/ieee1394/dv1394.c +++ b/drivers/ieee1394/dv1394.c @@ -2579,6 +2579,10 @@ static int __init dv1394_init_module(void) { int ret; + printk(KERN_WARNING + "WARNING: The dv1394 driver is unsupported and will be removed " + "from Linux soon. Use raw1394 instead.\n"); + cdev_init(&dv1394_cdev, &dv1394_fops); dv1394_cdev.owner = THIS_MODULE; kobject_set_name(&dv1394_cdev.kobj, "dv1394"); -- cgit v1.1 From e9429dfdc34402de3832ab7335f8ff0104f3ae84 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 19 Nov 2006 23:03:09 +0100 Subject: ieee1394: schedule unused symbol exports for removal This also means that former parts of ieee1394's API will be subject to change or removal. Signed-off-by: Stefan Richter --- drivers/ieee1394/Kconfig | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/Kconfig b/drivers/ieee1394/Kconfig index 680da9e..87325dd 100644 --- a/drivers/ieee1394/Kconfig +++ b/drivers/ieee1394/Kconfig @@ -67,16 +67,11 @@ config IEEE1394_CONFIG_ROM_IP1394 eth1394 option below. config IEEE1394_EXPORT_FULL_API - bool "Export all symbols of ieee1394's API" + bool "Export all symbols of ieee1394's API (deprecated)" depends on IEEE1394 default n help - Export all symbols of ieee1394's driver programming interface, even - those that are not currently used by the standard IEEE 1394 drivers. - - This option does not affect the interface to userspace applications. - Say Y here if you want to compile externally developed drivers that - make extended use of ieee1394's API. It is otherwise safe to say N. + This option will be removed soon. Don't worry, say N. comment "Device Drivers" depends on IEEE1394 -- cgit v1.1 From 4e834da1da2d7e80547e493c4b21c809dcb0ae09 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sun, 19 Nov 2006 23:04:31 +0100 Subject: ieee1394: schedule *_oui sysfs attributes for removal There is no manpower available to reform oui.db into a library for use in more kernel subsystems. The low ratio of usefulness to size and the occasional need to update oui.db from IEEE's official list suggest to drop oui.db. I plan to make a userspace script available which translates the remaining numeric sysfs attributes to names of organizations. Signed-off-by: Stefan Richter --- drivers/ieee1394/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/Kconfig b/drivers/ieee1394/Kconfig index 87325dd..21a1334 100644 --- a/drivers/ieee1394/Kconfig +++ b/drivers/ieee1394/Kconfig @@ -36,7 +36,7 @@ config IEEE1394_VERBOSEDEBUG else says N. config IEEE1394_OUI_DB - bool "OUI Database built-in" + bool "OUI Database built-in (deprecated)" depends on IEEE1394 help If you say Y here, then an OUI list (vendor unique ID's) will be -- cgit v1.1 From ff6a4cd2e18430f04e59382103c7b1f53ba114e0 Mon Sep 17 00:00:00 2001 From: Luca Tettamanti Date: Wed, 15 Nov 2006 19:14:15 +0100 Subject: sbp2: make 1bit bitfield unsigned A signed single-bit bitfield doesn't make much sense. Make it unsigned. Signed-off-by: Luca Tettamanti Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index 38ca119..ef24d63 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -302,7 +302,7 @@ struct sbp2_lu { u64 status_fifo_addr; /* Waitqueue flag for logins, reconnects, logouts, query logins */ - int access_complete:1; + unsigned int access_complete:1; /* Pool of command ORBs for this logical unit */ spinlock_t cmd_orb_lock; -- cgit v1.1 From cec1a31196a6edb1397ffb8fbdc0410dd8946d78 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 18 Nov 2006 23:16:11 +0100 Subject: ieee1394: nodemgr: remove duplicate assignment Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 89a4bd4..d672b4d 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -798,7 +798,7 @@ static void nodemgr_remove_uds(struct node_entry *ne) static void nodemgr_remove_ne(struct node_entry *ne) { - struct device *dev = &ne->device; + struct device *dev; dev = get_device(&ne->device); if (!dev) -- cgit v1.1 From 8252bbb1363b7fe963a3eb6f8a36da619a6f5a65 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Wed, 22 Nov 2006 21:09:42 +0100 Subject: ieee1394: nodemgr: fix deadlock in shutdown If "modprobe ohci1394" was quickly followed by "modprobe -r ohci1394", say with 1 second pause in between, the modprobe -r got stuck in uninterruptible sleep in kthread_stop. At the same time the knodemgrd slept uninterruptibly in bus_rescan_devices_helper. That's because driver_detach took the semaphore of the PCI device and bus_rescan_devices_helper wanted to take the semaphore of the FireWire host device's parent, which is the same semaphore. This was a regression since Linux 2.6.16, commit bf74ad5bc41727d5f2f1c6bedb2c1fac394de731, "Hold the device's parent's lock during probe and remove". The fix (or workaround) adds a dummy driver to the hpsb_host device. Now bus_rescan_devices_helper won't scan the host device anymore. This doesn't hurt since we have no drivers which will bind to these devices and it is unlikely that there will ever be such a driver. The dummy driver is befittingly presented as a representation of ieee1394 itself. Fixes: http://bugzilla.kernel.org/show_bug.cgi?id=6706 Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index d672b4d..d90ec6d 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -260,9 +261,20 @@ static struct device nodemgr_dev_template_ne = { .release = nodemgr_release_ne, }; +/* This dummy driver prevents the host devices from being scanned. We have no + * useful drivers for them yet, and there would be a deadlock possible if the + * driver core scans the host device while the host's low-level driver (i.e. + * the host's parent device) is being removed. */ +static struct device_driver nodemgr_mid_layer_driver = { + .bus = &ieee1394_bus_type, + .name = "nodemgr", + .owner = THIS_MODULE, +}; + struct device nodemgr_dev_template_host = { .bus = &ieee1394_bus_type, .release = nodemgr_release_host, + .driver = &nodemgr_mid_layer_driver, }; @@ -705,11 +717,14 @@ static int nodemgr_bus_match(struct device * dev, struct device_driver * drv) return 0; ud = container_of(dev, struct unit_directory, device); - driver = container_of(drv, struct hpsb_protocol_driver, driver); - if (ud->ne->in_limbo || ud->ignore_driver) return 0; + /* We only match drivers of type hpsb_protocol_driver */ + if (drv == &nodemgr_mid_layer_driver) + return 0; + + driver = container_of(drv, struct hpsb_protocol_driver, driver); for (id = driver->id_table; id->match_flags != 0; id++) { if ((id->match_flags & IEEE1394_MATCH_VENDOR_ID) && id->vendor_id != ud->vendor_id) @@ -1900,7 +1915,7 @@ int init_ieee1394_nodemgr(void) class_unregister(&nodemgr_ne_class); return error; } - + error = driver_register(&nodemgr_mid_layer_driver); hpsb_register_highlevel(&nodemgr_highlevel); return 0; } -- cgit v1.1 From d41bba2d3adcddbdd7b5ed4d4abf07890cf6006f Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Wed, 22 Nov 2006 21:28:19 +0100 Subject: ieee1394: nodemgr: spaces to tabs whitespace pedantry Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 98 +++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 49 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index d90ec6d..d2a5439 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -100,7 +100,7 @@ static int nodemgr_check_speed(struct nodemgr_csr_info *ci, u64 addr, } static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length, - void *buffer, void *__ci) + void *buffer, void *__ci) { struct nodemgr_csr_info *ci = (struct nodemgr_csr_info*)__ci; int i, error; @@ -319,8 +319,8 @@ static ssize_t fw_drv_show_##field (struct device_driver *drv, char *buf) \ return sprintf(buf, format_string, (type)driver->field);\ } \ static struct driver_attribute driver_attr_drv_##field = { \ - .attr = {.name = __stringify(field), .mode = S_IRUGO }, \ - .show = fw_drv_show_##field, \ + .attr = {.name = __stringify(field), .mode = S_IRUGO }, \ + .show = fw_drv_show_##field, \ }; @@ -541,7 +541,7 @@ static ssize_t fw_show_drv_device_ids(struct device_driver *drv, char *buf) int length = 0; char *scratch = buf; - driver = container_of(drv, struct hpsb_protocol_driver, driver); + driver = container_of(drv, struct hpsb_protocol_driver, driver); for (id = driver->id_table; id->match_flags != 0; id++) { int need_coma = 0; @@ -708,8 +708,8 @@ fail: static int nodemgr_bus_match(struct device * dev, struct device_driver * drv) { - struct hpsb_protocol_driver *driver; - struct unit_directory *ud; + struct hpsb_protocol_driver *driver; + struct unit_directory *ud; struct ieee1394_device_id *id; /* We only match unit directories */ @@ -725,25 +725,25 @@ static int nodemgr_bus_match(struct device * dev, struct device_driver * drv) return 0; driver = container_of(drv, struct hpsb_protocol_driver, driver); - for (id = driver->id_table; id->match_flags != 0; id++) { - if ((id->match_flags & IEEE1394_MATCH_VENDOR_ID) && - id->vendor_id != ud->vendor_id) - continue; + for (id = driver->id_table; id->match_flags != 0; id++) { + if ((id->match_flags & IEEE1394_MATCH_VENDOR_ID) && + id->vendor_id != ud->vendor_id) + continue; - if ((id->match_flags & IEEE1394_MATCH_MODEL_ID) && - id->model_id != ud->model_id) - continue; + if ((id->match_flags & IEEE1394_MATCH_MODEL_ID) && + id->model_id != ud->model_id) + continue; - if ((id->match_flags & IEEE1394_MATCH_SPECIFIER_ID) && - id->specifier_id != ud->specifier_id) - continue; + if ((id->match_flags & IEEE1394_MATCH_SPECIFIER_ID) && + id->specifier_id != ud->specifier_id) + continue; - if ((id->match_flags & IEEE1394_MATCH_VERSION) && - id->version != ud->version) - continue; + if ((id->match_flags & IEEE1394_MATCH_VERSION) && + id->version != ud->version) + continue; return 1; - } + } return 0; } @@ -852,16 +852,16 @@ static void nodemgr_update_bus_options(struct node_entry *ne) #endif quadlet_t busoptions = be32_to_cpu(ne->csr->bus_info_data[2]); - ne->busopt.irmc = (busoptions >> 31) & 1; - ne->busopt.cmc = (busoptions >> 30) & 1; - ne->busopt.isc = (busoptions >> 29) & 1; - ne->busopt.bmc = (busoptions >> 28) & 1; - ne->busopt.pmc = (busoptions >> 27) & 1; - ne->busopt.cyc_clk_acc = (busoptions >> 16) & 0xff; - ne->busopt.max_rec = 1 << (((busoptions >> 12) & 0xf) + 1); + ne->busopt.irmc = (busoptions >> 31) & 1; + ne->busopt.cmc = (busoptions >> 30) & 1; + ne->busopt.isc = (busoptions >> 29) & 1; + ne->busopt.bmc = (busoptions >> 28) & 1; + ne->busopt.pmc = (busoptions >> 27) & 1; + ne->busopt.cyc_clk_acc = (busoptions >> 16) & 0xff; + ne->busopt.max_rec = 1 << (((busoptions >> 12) & 0xf) + 1); ne->busopt.max_rom = (busoptions >> 8) & 0x3; - ne->busopt.generation = (busoptions >> 4) & 0xf; - ne->busopt.lnkspd = busoptions & 0x7; + ne->busopt.generation = (busoptions >> 4) & 0xf; + ne->busopt.lnkspd = busoptions & 0x7; HPSB_VERBOSE("NodeMgr: raw=0x%08x irmc=%d cmc=%d isc=%d bmc=%d pmc=%d " "cyc_clk_acc=%d max_rec=%d max_rom=%d gen=%d lspd=%d", @@ -954,7 +954,7 @@ static struct node_entry *find_entry_by_guid(u64 guid) } up(&nodemgr_ne_class.sem); - return ret_ne; + return ret_ne; } @@ -1416,22 +1416,22 @@ static void nodemgr_node_scan_one(struct host_info *hi, static void nodemgr_node_scan(struct host_info *hi, int generation) { - int count; - struct hpsb_host *host = hi->host; - struct selfid *sid = (struct selfid *)host->topology_map; - nodeid_t nodeid = LOCAL_BUS; + int count; + struct hpsb_host *host = hi->host; + struct selfid *sid = (struct selfid *)host->topology_map; + nodeid_t nodeid = LOCAL_BUS; - /* Scan each node on the bus */ - for (count = host->selfid_count; count; count--, sid++) { - if (sid->extended) - continue; + /* Scan each node on the bus */ + for (count = host->selfid_count; count; count--, sid++) { + if (sid->extended) + continue; - if (!sid->link_active) { - nodeid++; - continue; - } - nodemgr_node_scan_one(hi, nodeid++, generation); - } + if (!sid->link_active) { + nodeid++; + continue; + } + nodemgr_node_scan_one(hi, nodeid++, generation); + } } @@ -1597,7 +1597,7 @@ static void nodemgr_node_probe(struct host_info *hi, int generation) if (ne->needs_probe) nodemgr_probe_ne(hi, ne, generation); } - up(&nodemgr_ne_class.sem); + up(&nodemgr_ne_class.sem); /* If we had a bus reset while we were scanning the bus, it is @@ -1841,10 +1841,10 @@ int nodemgr_for_each_host(void *__data, int (*cb)(struct hpsb_host *, void *)) void hpsb_node_fill_packet(struct node_entry *ne, struct hpsb_packet *pkt) { - pkt->host = ne->host; - pkt->generation = ne->generation; + pkt->host = ne->host; + pkt->generation = ne->generation; barrier(); - pkt->node_id = ne->nodeid; + pkt->node_id = ne->nodeid; } int hpsb_node_write(struct node_entry *ne, u64 addr, @@ -1922,7 +1922,7 @@ int init_ieee1394_nodemgr(void) void cleanup_ieee1394_nodemgr(void) { - hpsb_unregister_highlevel(&nodemgr_highlevel); + hpsb_unregister_highlevel(&nodemgr_highlevel); class_unregister(&nodemgr_ud_class); class_unregister(&nodemgr_ne_class); -- cgit v1.1 From 9b7d9c096dd4e4baacc21b2588662bbb56f36c4e Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Wed, 22 Nov 2006 21:44:34 +0100 Subject: ieee1394: sbp2: convert from PCI DMA to generic DMA API conversion without change in functionality Signed-off-by: Stefan Richter --- drivers/ieee1394/Kconfig | 2 +- drivers/ieee1394/sbp2.c | 126 ++++++++++++++++++++++------------------------- drivers/ieee1394/sbp2.h | 2 +- 3 files changed, 62 insertions(+), 68 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/Kconfig b/drivers/ieee1394/Kconfig index 21a1334..e7d5657 100644 --- a/drivers/ieee1394/Kconfig +++ b/drivers/ieee1394/Kconfig @@ -120,7 +120,7 @@ comment "SBP-2 support (for storage devices) requires SCSI" config IEEE1394_SBP2 tristate "SBP-2 support (Harddisks etc.)" - depends on IEEE1394 && SCSI && (PCI || BROKEN) + depends on IEEE1394 && SCSI help This option enables you to use SBP-2 devices connected to an IEEE 1394 bus. SBP-2 devices include storage devices like harddisks and diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 5d3b96e..ab70598 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -48,7 +48,6 @@ * - make the parameter serialize_io configurable per device * - move all requests to fetch agent registers into non-atomic context, * replace all usages of sbp2util_node_write_no_wait by true transactions - * - convert to generic DMA mapping API to eliminate dependency on PCI * Grep for inline FIXME comments below. */ @@ -63,7 +62,6 @@ #include #include #include -#include #include #include #include @@ -491,14 +489,14 @@ static int sbp2util_create_command_orb_pool(struct sbp2_lu *lu) spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); return -ENOMEM; } - cmd->command_orb_dma = pci_map_single(hi->host->pdev, + cmd->command_orb_dma = dma_map_single(&hi->host->device, &cmd->command_orb, sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - cmd->sge_dma = pci_map_single(hi->host->pdev, + DMA_TO_DEVICE); + cmd->sge_dma = dma_map_single(&hi->host->device, &cmd->scatter_gather_element, sizeof(cmd->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); + DMA_BIDIRECTIONAL); INIT_LIST_HEAD(&cmd->list); list_add_tail(&cmd->list, &lu->cmd_orb_completed); } @@ -517,12 +515,12 @@ static void sbp2util_remove_command_orb_pool(struct sbp2_lu *lu) if (!list_empty(&lu->cmd_orb_completed)) list_for_each_safe(lh, next, &lu->cmd_orb_completed) { cmd = list_entry(lh, struct sbp2_command_info, list); - pci_unmap_single(host->pdev, cmd->command_orb_dma, + dma_unmap_single(&host->device, cmd->command_orb_dma, sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - pci_unmap_single(host->pdev, cmd->sge_dma, + DMA_TO_DEVICE); + dma_unmap_single(&host->device, cmd->sge_dma, sizeof(cmd->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); + DMA_BIDIRECTIONAL); kfree(cmd); } spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); @@ -602,17 +600,17 @@ static void sbp2util_mark_command_completed(struct sbp2_lu *lu, if (cmd->cmd_dma) { if (cmd->dma_type == CMD_DMA_SINGLE) - pci_unmap_single(host->pdev, cmd->cmd_dma, + dma_unmap_single(&host->device, cmd->cmd_dma, cmd->dma_size, cmd->dma_dir); else if (cmd->dma_type == CMD_DMA_PAGE) - pci_unmap_page(host->pdev, cmd->cmd_dma, + dma_unmap_page(&host->device, cmd->cmd_dma, cmd->dma_size, cmd->dma_dir); /* XXX: Check for CMD_DMA_NONE bug */ cmd->dma_type = CMD_DMA_NONE; cmd->cmd_dma = 0; } if (cmd->sge_buffer) { - pci_unmap_sg(host->pdev, cmd->sge_buffer, + dma_unmap_sg(&host->device, cmd->sge_buffer, cmd->dma_size, cmd->dma_dir); cmd->sge_buffer = NULL; } @@ -837,39 +835,39 @@ static int sbp2_start_device(struct sbp2_lu *lu) struct sbp2_fwhost_info *hi = lu->hi; int error; - lu->login_response = pci_alloc_consistent(hi->host->pdev, + lu->login_response = dma_alloc_coherent(&hi->host->device, sizeof(struct sbp2_login_response), - &lu->login_response_dma); + &lu->login_response_dma, GFP_KERNEL); if (!lu->login_response) goto alloc_fail; - lu->query_logins_orb = pci_alloc_consistent(hi->host->pdev, + lu->query_logins_orb = dma_alloc_coherent(&hi->host->device, sizeof(struct sbp2_query_logins_orb), - &lu->query_logins_orb_dma); + &lu->query_logins_orb_dma, GFP_KERNEL); if (!lu->query_logins_orb) goto alloc_fail; - lu->query_logins_response = pci_alloc_consistent(hi->host->pdev, + lu->query_logins_response = dma_alloc_coherent(&hi->host->device, sizeof(struct sbp2_query_logins_response), - &lu->query_logins_response_dma); + &lu->query_logins_response_dma, GFP_KERNEL); if (!lu->query_logins_response) goto alloc_fail; - lu->reconnect_orb = pci_alloc_consistent(hi->host->pdev, + lu->reconnect_orb = dma_alloc_coherent(&hi->host->device, sizeof(struct sbp2_reconnect_orb), - &lu->reconnect_orb_dma); + &lu->reconnect_orb_dma, GFP_KERNEL); if (!lu->reconnect_orb) goto alloc_fail; - lu->logout_orb = pci_alloc_consistent(hi->host->pdev, + lu->logout_orb = dma_alloc_coherent(&hi->host->device, sizeof(struct sbp2_logout_orb), - &lu->logout_orb_dma); + &lu->logout_orb_dma, GFP_KERNEL); if (!lu->logout_orb) goto alloc_fail; - lu->login_orb = pci_alloc_consistent(hi->host->pdev, + lu->login_orb = dma_alloc_coherent(&hi->host->device, sizeof(struct sbp2_login_orb), - &lu->login_orb_dma); + &lu->login_orb_dma, GFP_KERNEL); if (!lu->login_orb) goto alloc_fail; @@ -930,32 +928,32 @@ static void sbp2_remove_device(struct sbp2_lu *lu) list_del(&lu->lu_list); if (lu->login_response) - pci_free_consistent(hi->host->pdev, + dma_free_coherent(&hi->host->device, sizeof(struct sbp2_login_response), lu->login_response, lu->login_response_dma); if (lu->login_orb) - pci_free_consistent(hi->host->pdev, + dma_free_coherent(&hi->host->device, sizeof(struct sbp2_login_orb), lu->login_orb, lu->login_orb_dma); if (lu->reconnect_orb) - pci_free_consistent(hi->host->pdev, + dma_free_coherent(&hi->host->device, sizeof(struct sbp2_reconnect_orb), lu->reconnect_orb, lu->reconnect_orb_dma); if (lu->logout_orb) - pci_free_consistent(hi->host->pdev, + dma_free_coherent(&hi->host->device, sizeof(struct sbp2_logout_orb), lu->logout_orb, lu->logout_orb_dma); if (lu->query_logins_orb) - pci_free_consistent(hi->host->pdev, + dma_free_coherent(&hi->host->device, sizeof(struct sbp2_query_logins_orb), lu->query_logins_orb, lu->query_logins_orb_dma); if (lu->query_logins_response) - pci_free_consistent(hi->host->pdev, + dma_free_coherent(&hi->host->device, sizeof(struct sbp2_query_logins_response), lu->query_logins_response, lu->query_logins_response_dma); @@ -1446,7 +1444,7 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, cmd->dma_size = sgpnt[0].length; cmd->dma_type = CMD_DMA_PAGE; - cmd->cmd_dma = pci_map_page(hi->host->pdev, + cmd->cmd_dma = dma_map_page(&hi->host->device, sgpnt[0].page, sgpnt[0].offset, cmd->dma_size, cmd->dma_dir); @@ -1458,7 +1456,7 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb, &cmd->scatter_gather_element[0]; u32 sg_count, sg_len; dma_addr_t sg_addr; - int i, count = pci_map_sg(hi->host->pdev, sgpnt, scsi_use_sg, + int i, count = dma_map_sg(&hi->host->device, sgpnt, scsi_use_sg, dma_dir); cmd->dma_size = scsi_use_sg; @@ -1509,7 +1507,7 @@ static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb, cmd->dma_dir = dma_dir; cmd->dma_size = scsi_request_bufflen; cmd->dma_type = CMD_DMA_SINGLE; - cmd->cmd_dma = pci_map_single(hi->host->pdev, scsi_request_buffer, + cmd->cmd_dma = dma_map_single(&hi->host->device, scsi_request_buffer, cmd->dma_size, cmd->dma_dir); orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id); orb->misc |= ORB_SET_DIRECTION(orb_direction); @@ -1627,12 +1625,12 @@ static void sbp2_link_orb_command(struct sbp2_lu *lu, size_t length; unsigned long flags; - pci_dma_sync_single_for_device(hi->host->pdev, cmd->command_orb_dma, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - pci_dma_sync_single_for_device(hi->host->pdev, cmd->sge_dma, - sizeof(cmd->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); + dma_sync_single_for_device(&hi->host->device, cmd->command_orb_dma, + sizeof(struct sbp2_command_orb), + DMA_TO_DEVICE); + dma_sync_single_for_device(&hi->host->device, cmd->sge_dma, + sizeof(cmd->scatter_gather_element), + DMA_BIDIRECTIONAL); /* check to see if there are any previous orbs to use */ spin_lock_irqsave(&lu->cmd_orb_lock, flags); @@ -1656,16 +1654,16 @@ static void sbp2_link_orb_command(struct sbp2_lu *lu, * The target's fetch agent may or may not have read this * previous ORB yet. */ - pci_dma_sync_single_for_cpu(hi->host->pdev, last_orb_dma, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); + dma_sync_single_for_cpu(&hi->host->device, last_orb_dma, + sizeof(struct sbp2_command_orb), + DMA_TO_DEVICE); last_orb->next_ORB_lo = cpu_to_be32(cmd->command_orb_dma); wmb(); /* Tells hardware that this pointer is valid */ last_orb->next_ORB_hi = 0; - pci_dma_sync_single_for_device(hi->host->pdev, last_orb_dma, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); + dma_sync_single_for_device(&hi->host->device, last_orb_dma, + sizeof(struct sbp2_command_orb), + DMA_TO_DEVICE); addr += SBP2_DOORBELL_OFFSET; data[0] = 0; length = 4; @@ -1792,14 +1790,12 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, else cmd = sbp2util_find_command_for_orb(lu, sb->ORB_offset_lo); if (cmd) { - pci_dma_sync_single_for_cpu(hi->host->pdev, - cmd->command_orb_dma, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - pci_dma_sync_single_for_cpu(hi->host->pdev, - cmd->sge_dma, - sizeof(cmd->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); + dma_sync_single_for_cpu(&hi->host->device, cmd->command_orb_dma, + sizeof(struct sbp2_command_orb), + DMA_TO_DEVICE); + dma_sync_single_for_cpu(&hi->host->device, cmd->sge_dma, + sizeof(cmd->scatter_gather_element), + DMA_BIDIRECTIONAL); /* Grab SCSI command pointers and check status. */ /* * FIXME: If the src field in the status is 1, the ORB DMA must @@ -1935,13 +1931,12 @@ static void sbp2scsi_complete_all_commands(struct sbp2_lu *lu, u32 status) while (!list_empty(&lu->cmd_orb_inuse)) { lh = lu->cmd_orb_inuse.next; cmd = list_entry(lh, struct sbp2_command_info, list); - pci_dma_sync_single_for_cpu(hi->host->pdev, - cmd->command_orb_dma, - sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - pci_dma_sync_single_for_cpu(hi->host->pdev, cmd->sge_dma, - sizeof(cmd->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); + dma_sync_single_for_cpu(&hi->host->device, cmd->command_orb_dma, + sizeof(struct sbp2_command_orb), + DMA_TO_DEVICE); + dma_sync_single_for_cpu(&hi->host->device, cmd->sge_dma, + sizeof(cmd->scatter_gather_element), + DMA_BIDIRECTIONAL); sbp2util_mark_command_completed(lu, cmd); if (cmd->Current_SCpnt) { cmd->Current_SCpnt->result = status << 16; @@ -2064,14 +2059,13 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt) spin_lock_irqsave(&lu->cmd_orb_lock, flags); cmd = sbp2util_find_command_for_SCpnt(lu, SCpnt); if (cmd) { - pci_dma_sync_single_for_cpu(hi->host->pdev, + dma_sync_single_for_cpu(&hi->host->device, cmd->command_orb_dma, sizeof(struct sbp2_command_orb), - PCI_DMA_TODEVICE); - pci_dma_sync_single_for_cpu(hi->host->pdev, - cmd->sge_dma, + DMA_TO_DEVICE); + dma_sync_single_for_cpu(&hi->host->device, cmd->sge_dma, sizeof(cmd->scatter_gather_element), - PCI_DMA_BIDIRECTIONAL); + DMA_BIDIRECTIONAL); sbp2util_mark_command_completed(lu, cmd); if (cmd->Current_SCpnt) { cmd->Current_SCpnt->result = DID_ABORT << 16; diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index ef24d63..9ae8423 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h @@ -263,7 +263,7 @@ struct sbp2_command_info { dma_addr_t cmd_dma; enum sbp2_dma_types dma_type; unsigned long dma_size; - int dma_dir; + enum dma_data_direction dma_dir; }; /* Per FireWire host */ -- cgit v1.1 From ed30c26ee809b060f437fd9f1b3453e1d0375e32 Mon Sep 17 00:00:00 2001 From: Ben Collins Date: Thu, 23 Nov 2006 13:59:48 -0500 Subject: ieee1394: Consolidate driver registering This patch consolidates some bookkeeping for driver registering. It closely models what pci_register_driver() does. The main addition is that the owner of the driver is set, so we get a proper symlink for /sys/bus/ieee1394/driver/*/module. Also moves setting of name and bus type into nodemgr. Because of this, we can remove the EXPORT_SYMBOL for ieee1394_bus_type, since it's now only used in ieee1394.ko. Signed-off-by: Stefan Richter --- drivers/ieee1394/dv1394.c | 6 +----- drivers/ieee1394/eth1394.c | 4 +--- drivers/ieee1394/ieee1394_core.c | 3 +-- drivers/ieee1394/nodemgr.c | 13 ++++++++++--- drivers/ieee1394/nodemgr.h | 7 ++++++- drivers/ieee1394/raw1394.c | 6 +----- drivers/ieee1394/sbp2.c | 4 +--- drivers/ieee1394/video1394.c | 6 +----- 8 files changed, 22 insertions(+), 27 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c index 3bd78ef..1084da4 100644 --- a/drivers/ieee1394/dv1394.c +++ b/drivers/ieee1394/dv1394.c @@ -2180,12 +2180,8 @@ static struct ieee1394_device_id dv1394_id_table[] = { MODULE_DEVICE_TABLE(ieee1394, dv1394_id_table); static struct hpsb_protocol_driver dv1394_driver = { - .name = "DV/1394 Driver", + .name = "dv1394", .id_table = dv1394_id_table, - .driver = { - .name = "dv1394", - .bus = &ieee1394_bus_type, - }, }; diff --git a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c index 27d6c64..97e5c3d 100644 --- a/drivers/ieee1394/eth1394.c +++ b/drivers/ieee1394/eth1394.c @@ -474,12 +474,10 @@ static struct ieee1394_device_id eth1394_id_table[] = { MODULE_DEVICE_TABLE(ieee1394, eth1394_id_table); static struct hpsb_protocol_driver eth1394_proto_driver = { - .name = "IPv4 over 1394 Driver", + .name = ETH1394_DRIVER_NAME, .id_table = eth1394_id_table, .update = eth1394_update, .driver = { - .name = ETH1394_DRIVER_NAME, - .bus = &ieee1394_bus_type, .probe = eth1394_probe, .remove = eth1394_remove, }, diff --git a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c index 5fccf9f..7778ab3 100644 --- a/drivers/ieee1394/ieee1394_core.c +++ b/drivers/ieee1394/ieee1394_core.c @@ -1237,9 +1237,8 @@ EXPORT_SYMBOL(highlevel_remove_host); /** nodemgr.c **/ EXPORT_SYMBOL(hpsb_node_fill_packet); EXPORT_SYMBOL(hpsb_node_write); -EXPORT_SYMBOL(hpsb_register_protocol); +EXPORT_SYMBOL(__hpsb_register_protocol); EXPORT_SYMBOL(hpsb_unregister_protocol); -EXPORT_SYMBOL(ieee1394_bus_type); #ifdef CONFIG_IEEE1394_EXPORT_FULL_API EXPORT_SYMBOL(nodemgr_for_each_host); #endif diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index d2a5439..2953aeb 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -1282,12 +1282,19 @@ static int nodemgr_uevent(struct class_device *cdev, char **envp, int num_envp, #endif /* CONFIG_HOTPLUG */ -int hpsb_register_protocol(struct hpsb_protocol_driver *driver) +int __hpsb_register_protocol(struct hpsb_protocol_driver *drv, + struct module *owner) { + int error; + + drv->driver.bus = &ieee1394_bus_type; + drv->driver.owner = owner; + drv->driver.name = drv->name; + /* This will cause a probe for devices */ - int error = driver_register(&driver->driver); + error = driver_register(&drv->driver); if (!error) - nodemgr_create_drv_files(driver); + nodemgr_create_drv_files(drv); return error; } diff --git a/drivers/ieee1394/nodemgr.h b/drivers/ieee1394/nodemgr.h index 0e1e7d9..e25cbad 100644 --- a/drivers/ieee1394/nodemgr.h +++ b/drivers/ieee1394/nodemgr.h @@ -144,7 +144,12 @@ struct hpsb_protocol_driver { struct device_driver driver; }; -int hpsb_register_protocol(struct hpsb_protocol_driver *driver); +int __hpsb_register_protocol(struct hpsb_protocol_driver *, struct module *); +static inline int hpsb_register_protocol(struct hpsb_protocol_driver *driver) +{ + return __hpsb_register_protocol(driver, THIS_MODULE); +} + void hpsb_unregister_protocol(struct hpsb_protocol_driver *driver); static inline int hpsb_node_entry_valid(struct node_entry *ne) diff --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c index 4889383d..ad2108f 100644 --- a/drivers/ieee1394/raw1394.c +++ b/drivers/ieee1394/raw1394.c @@ -2987,12 +2987,8 @@ static struct ieee1394_device_id raw1394_id_table[] = { MODULE_DEVICE_TABLE(ieee1394, raw1394_id_table); static struct hpsb_protocol_driver raw1394_driver = { - .name = "raw1394 Driver", + .name = "raw1394", .id_table = raw1394_id_table, - .driver = { - .name = "raw1394", - .bus = &ieee1394_bus_type, - }, }; /******************************************************************************/ diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index ab70598..ffcd9e4 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -259,12 +259,10 @@ static int sbp2_remove(struct device *); static int sbp2_update(struct unit_directory *); static struct hpsb_protocol_driver sbp2_driver = { - .name = "SBP2 Driver", + .name = SBP2_DEVICE_NAME, .id_table = sbp2_id_table, .update = sbp2_update, .driver = { - .name = SBP2_DEVICE_NAME, - .bus = &ieee1394_bus_type, .probe = sbp2_probe, .remove = sbp2_remove, }, diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c index 77f58bc..598b19f 100644 --- a/drivers/ieee1394/video1394.c +++ b/drivers/ieee1394/video1394.c @@ -1308,12 +1308,8 @@ static struct ieee1394_device_id video1394_id_table[] = { MODULE_DEVICE_TABLE(ieee1394, video1394_id_table); static struct hpsb_protocol_driver video1394_driver = { - .name = "1394 Digital Camera Driver", + .name = VIDEO1394_DRIVER_NAME, .id_table = video1394_id_table, - .driver = { - .name = VIDEO1394_DRIVER_NAME, - .bus = &ieee1394_bus_type, - }, }; -- cgit v1.1 From 3015c7397876f5c5de0e178e2dfe22859b5d8754 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Fri, 24 Nov 2006 20:19:09 +0100 Subject: ieee1394: conditionally export ieee1394_bus_type Follow-up to patch "Consolidate driver registering": Since I plan the lifetime of Linux 2.6.20 to be the deprecation phase of CONFIG_IEEE1394_EXPORT_FULL_API, it seems fair to keep all previously exported symbols available with this option until this phase is over. Signed-off-by: Stefan Richter --- drivers/ieee1394/ieee1394_core.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers') diff --git a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c index 7778ab3..9a48ca2 100644 --- a/drivers/ieee1394/ieee1394_core.c +++ b/drivers/ieee1394/ieee1394_core.c @@ -1240,6 +1240,7 @@ EXPORT_SYMBOL(hpsb_node_write); EXPORT_SYMBOL(__hpsb_register_protocol); EXPORT_SYMBOL(hpsb_unregister_protocol); #ifdef CONFIG_IEEE1394_EXPORT_FULL_API +EXPORT_SYMBOL(ieee1394_bus_type); EXPORT_SYMBOL(nodemgr_for_each_host); #endif -- cgit v1.1 From 1e4f7bc8f8ce07b850a5831d01a6eae83055bb42 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 2 Dec 2006 22:23:34 +0100 Subject: ieee1394: nodemgr: remove a kcalloc Was I sleepwalking when I wrote this? Signed-off-by: Stefan Richter --- drivers/ieee1394/nodemgr.c | 66 ++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 46 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 2953aeb..61307ca 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -754,59 +754,33 @@ static DEFINE_MUTEX(nodemgr_serialize_remove_uds); static void nodemgr_remove_uds(struct node_entry *ne) { struct class_device *cdev; - struct unit_directory *ud, **unreg; - size_t i, count; + struct unit_directory *tmp, *ud; - /* - * This is awkward: - * Iteration over nodemgr_ud_class.children has to be protected by + /* Iteration over nodemgr_ud_class.children has to be protected by * nodemgr_ud_class.sem, but class_device_unregister() will eventually - * take nodemgr_ud_class.sem too. Therefore store all uds to be - * unregistered in a temporary array, release the semaphore, and then - * unregister the uds. - * - * Since nodemgr_remove_uds can also run in other contexts than the - * knodemgrds (which are currently globally serialized), protect the + * take nodemgr_ud_class.sem too. Therefore pick out one ud at a time, + * release the semaphore, and then unregister the ud. Since this code + * may be called from other contexts besides the knodemgrds, protect the * gap after release of the semaphore by nodemgr_serialize_remove_uds. */ - mutex_lock(&nodemgr_serialize_remove_uds); - - down(&nodemgr_ud_class.sem); - count = 0; - list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { - ud = container_of(cdev, struct unit_directory, class_dev); - if (ud->ne == ne) - count++; - } - if (!count) { - up(&nodemgr_ud_class.sem); - mutex_unlock(&nodemgr_serialize_remove_uds); - return; - } - unreg = kcalloc(count, sizeof(*unreg), GFP_KERNEL); - if (!unreg) { - HPSB_ERR("NodeMgr: out of memory in nodemgr_remove_uds"); - up(&nodemgr_ud_class.sem); - mutex_unlock(&nodemgr_serialize_remove_uds); - return; - } - i = 0; - list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { - ud = container_of(cdev, struct unit_directory, class_dev); - if (ud->ne == ne) { - BUG_ON(i >= count); - unreg[i++] = ud; + for (;;) { + ud = NULL; + down(&nodemgr_ud_class.sem); + list_for_each_entry(cdev, &nodemgr_ud_class.children, node) { + tmp = container_of(cdev, struct unit_directory, + class_dev); + if (tmp->ne == ne) { + ud = tmp; + break; + } } + up(&nodemgr_ud_class.sem); + if (ud == NULL) + break; + class_device_unregister(&ud->class_dev); + device_unregister(&ud->device); } - up(&nodemgr_ud_class.sem); - - for (i = 0; i < count; i++) { - class_device_unregister(&unreg[i]->class_dev); - device_unregister(&unreg[i]->device); - } - kfree(unreg); - mutex_unlock(&nodemgr_serialize_remove_uds); } -- cgit v1.1 From ec9b7e1044d718723d16390179abc6d4c8d9b0a1 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Thu, 7 Dec 2006 23:23:25 +0100 Subject: ieee1394: sbp2: code formatting around work_struct stuff Merge is finished, can bring the code in readable style again. Signed-off-by: Stefan Richter --- drivers/ieee1394/sbp2.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'drivers') diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index ffcd9e4..e68b80b 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c @@ -458,17 +458,20 @@ static void sbp2util_notify_fetch_agent(struct sbp2_lu *lu, u64 offset, static void sbp2util_write_orb_pointer(struct work_struct *work) { + struct sbp2_lu *lu = container_of(work, struct sbp2_lu, protocol_work); quadlet_t data[2]; - data[0] = ORB_SET_NODE_ID((container_of(work, struct sbp2_lu, protocol_work))->hi->host->node_id); - data[1] = (container_of(work, struct sbp2_lu, protocol_work))->last_orb_dma; + data[0] = ORB_SET_NODE_ID(lu->hi->host->node_id); + data[1] = lu->last_orb_dma; sbp2util_cpu_to_be32_buffer(data, 8); - sbp2util_notify_fetch_agent(container_of(work, struct sbp2_lu, protocol_work), SBP2_ORB_POINTER_OFFSET, data, 8); + sbp2util_notify_fetch_agent(lu, SBP2_ORB_POINTER_OFFSET, data, 8); } static void sbp2util_write_doorbell(struct work_struct *work) { - sbp2util_notify_fetch_agent(container_of(work, struct sbp2_lu, protocol_work), SBP2_DOORBELL_OFFSET, NULL, 4); + struct sbp2_lu *lu = container_of(work, struct sbp2_lu, protocol_work); + + sbp2util_notify_fetch_agent(lu, SBP2_DOORBELL_OFFSET, NULL, 4); } static int sbp2util_create_command_orb_pool(struct sbp2_lu *lu) @@ -1399,7 +1402,7 @@ static int sbp2_agent_reset(struct sbp2_lu *lu, int wait) int retval; unsigned long flags; - /* cancel_delayed_work(&lu->protocol_work); */ + /* flush lu->protocol_work */ if (wait) flush_scheduled_work(); @@ -1682,8 +1685,7 @@ static void sbp2_link_orb_command(struct sbp2_lu *lu, scsi_block_requests(lu->shost); PREPARE_WORK(&lu->protocol_work, last_orb ? sbp2util_write_doorbell: - sbp2util_write_orb_pointer - /* */); + sbp2util_write_orb_pointer); schedule_work(&lu->protocol_work); } } -- cgit v1.1