Merge master.kernel.org:/home/rmk/linux-2.6-mmc
[powerpc.git] / drivers / ieee1394 / sbp2.c
index eca92eb..f420660 100644 (file)
@@ -214,6 +214,7 @@ static u32 global_outstanding_dmas = 0;
 #endif
 
 #define SBP2_ERR(fmt, args...)         HPSB_ERR("sbp2: "fmt, ## args)
+#define SBP2_DEBUG_ENTER()             SBP2_DEBUG("%s", __FUNCTION__)
 
 /*
  * Globals
@@ -495,22 +496,17 @@ 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.
+ * Must be called with scsi_id->sbp2_command_orb_lock held.
  */
-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_find_command_for_SCpnt(
+               struct scsi_id_instance_data *scsi_id, void *SCpnt)
 {
        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) {
-                       if (command->Current_SCpnt == SCpnt) {
-                               spin_unlock_irqrestore(&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)
+                       if (command->Current_SCpnt == SCpnt)
                                return command;
-                       }
-               }
-       }
-       spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
        return NULL;
 }
 
@@ -535,7 +531,7 @@ static struct sbp2_command_info *sbp2util_allocate_command_orb(
                command->Current_SCpnt = Current_SCpnt;
                list_add_tail(&command->list, &scsi_id->sbp2_command_orb_inuse);
        } else {
-               SBP2_ERR("sbp2util_allocate_command_orb - No orbs available!");
+               SBP2_ERR("%s: no orbs available", __FUNCTION__);
        }
        spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
        return command;
@@ -549,7 +545,7 @@ static void sbp2util_free_command_dma(struct sbp2_command_info *command)
        struct hpsb_host *host;
 
        if (!scsi_id) {
-               printk(KERN_ERR "%s: scsi_id == NULL\n", __FUNCTION__);
+               SBP2_ERR("%s: scsi_id == NULL", __FUNCTION__);
                return;
        }
 
@@ -579,17 +575,15 @@ 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.
  */
-static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id,
-                                           struct sbp2_command_info *command)
+static void sbp2util_mark_command_completed(
+               struct scsi_id_instance_data *scsi_id,
+               struct sbp2_command_info *command)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
        list_del(&command->list);
        sbp2util_free_command_dma(command);
        list_add_tail(&command->list, &scsi_id->sbp2_command_orb_completed);
-       spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
 }
 
 /*
@@ -610,7 +604,7 @@ static int sbp2_probe(struct device *dev)
        struct unit_directory *ud;
        struct scsi_id_instance_data *scsi_id;
 
-       SBP2_DEBUG("sbp2_probe");
+       SBP2_DEBUG_ENTER();
 
        ud = container_of(dev, struct unit_directory, device);
 
@@ -635,7 +629,7 @@ static int sbp2_remove(struct device *dev)
        struct scsi_id_instance_data *scsi_id;
        struct scsi_device *sdev;
 
-       SBP2_DEBUG("sbp2_remove");
+       SBP2_DEBUG_ENTER();
 
        ud = container_of(dev, struct unit_directory, device);
        scsi_id = ud->device.driver_data;
@@ -667,7 +661,7 @@ static int sbp2_update(struct unit_directory *ud)
 {
        struct scsi_id_instance_data *scsi_id = ud->device.driver_data;
 
-       SBP2_DEBUG("sbp2_update");
+       SBP2_DEBUG_ENTER();
 
        if (sbp2_reconnect_device(scsi_id)) {
 
@@ -715,7 +709,7 @@ 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("sbp2_alloc_device");
+       SBP2_DEBUG_ENTER();
 
        scsi_id = kzalloc(sizeof(*scsi_id), GFP_KERNEL);
        if (!scsi_id) {
@@ -749,12 +743,22 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud
 
 #ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
                /* Handle data movement if physical dma is not
-                * enabled/supportedon host controller */
-               hpsb_register_addrspace(&sbp2_highlevel, ud->ne->host, &sbp2_physdma_ops,
-                                       0x0ULL, 0xfffffffcULL);
+                * enabled or not supported on host controller */
+               if (!hpsb_register_addrspace(&sbp2_highlevel, ud->ne->host,
+                                            &sbp2_physdma_ops,
+                                            0x0ULL, 0xfffffffcULL)) {
+                       SBP2_ERR("failed to register lower 4GB address range");
+                       goto failed_alloc;
+               }
 #endif
        }
 
+       /* Prevent unloading of the 1394 host */
+       if (!try_module_get(hi->host->driver->owner)) {
+               SBP2_ERR("failed to get a reference on 1394 host driver");
+               goto failed_alloc;
+       }
+
        scsi_id->hi = hi;
 
        list_add_tail(&scsi_id->scsi_list, &hi->scsi_ids);
@@ -816,7 +820,7 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id)
        struct sbp2scsi_host_info *hi = scsi_id->hi;
        int error;
 
-       SBP2_DEBUG("sbp2_start_device");
+       SBP2_DEBUG_ENTER();
 
        /* Login FIFO DMA */
        scsi_id->login_response =
@@ -891,7 +895,6 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id)
         * allows someone else to login instead. One second makes sense. */
        msleep_interruptible(1000);
        if (signal_pending(current)) {
-               SBP2_WARN("aborting sbp2_start_device due to event");
                sbp2_remove_device(scsi_id);
                return -EINTR;
        }
@@ -944,7 +947,7 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id)
 {
        struct sbp2scsi_host_info *hi;
 
-       SBP2_DEBUG("sbp2_remove_device");
+       SBP2_DEBUG_ENTER();
 
        if (!scsi_id)
                return;
@@ -1015,6 +1018,9 @@ static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id)
 
        scsi_id->ud->device.driver_data = NULL;
 
+       if (hi)
+               module_put(hi->host->driver->owner);
+
        SBP2_DEBUG("SBP-2 device removed, SCSI ID = %d", scsi_id->ud->id);
 
        kfree(scsi_id);
@@ -1073,23 +1079,20 @@ static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id)
        int max_logins;
        int active_logins;
 
-       SBP2_DEBUG("sbp2_query_logins");
+       SBP2_DEBUG_ENTER();
 
        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);
-       SBP2_DEBUG("sbp2_query_logins: query_response_hi/lo initialized");
 
        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);
-       SBP2_DEBUG("sbp2_query_logins: lun_misc initialized");
 
        scsi_id->query_logins_orb->reserved_resp_length =
                ORB_SET_QUERY_LOGINS_RESP_LENGTH(sizeof(struct sbp2_query_logins_response));
-       SBP2_DEBUG("sbp2_query_logins: reserved_resp_length initialized");
 
        scsi_id->query_logins_orb->status_fifo_hi =
                ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id);
@@ -1098,25 +1101,19 @@ 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));
 
-       SBP2_DEBUG("sbp2_query_logins: orb byte-swapped");
-
        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));
        memset(&scsi_id->status_block, 0, sizeof(struct sbp2_status_block));
 
-       SBP2_DEBUG("sbp2_query_logins: query_logins_response/status FIFO memset");
-
        data[0] = ORB_SET_NODE_ID(hi->host->node_id);
        data[1] = scsi_id->query_logins_orb_dma;
        sbp2util_cpu_to_be32_buffer(data, 8);
 
        atomic_set(&scsi_id->sbp2_login_complete, 0);
 
-       SBP2_DEBUG("sbp2_query_logins: prepared to write");
        hpsb_node_write(scsi_id->ne, scsi_id->sbp2_management_agent_addr, data, 8);
-       SBP2_DEBUG("sbp2_query_logins: written");
 
        if (sbp2util_down_timeout(&scsi_id->sbp2_login_complete, 2*HZ)) {
                SBP2_INFO("Error querying logins to SBP-2 device - timed out");
@@ -1165,10 +1162,10 @@ 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("sbp2_login_device");
+       SBP2_DEBUG_ENTER();
 
        if (!scsi_id->login_orb) {
-               SBP2_DEBUG("sbp2_login_device: login_orb not alloc'd!");
+               SBP2_DEBUG("%s: login_orb not alloc'd!", __FUNCTION__);
                return -EIO;
        }
 
@@ -1182,59 +1179,39 @@ static int sbp2_login_device(struct scsi_id_instance_data *scsi_id)
        /* Set-up login ORB, assume no password */
        scsi_id->login_orb->password_hi = 0;
        scsi_id->login_orb->password_lo = 0;
-       SBP2_DEBUG("sbp2_login_device: password_hi/lo initialized");
 
        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);
-       SBP2_DEBUG("sbp2_login_device: login_response_hi/lo initialized");
 
        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 */
        scsi_id->login_orb->lun_misc |= ORB_SET_LUN(scsi_id->sbp2_lun);
-       SBP2_DEBUG("sbp2_login_device: lun_misc initialized");
 
        scsi_id->login_orb->passwd_resp_lengths =
                ORB_SET_LOGIN_RESP_LENGTH(sizeof(struct sbp2_login_response));
-       SBP2_DEBUG("sbp2_login_device: passwd_resp_lengths initialized");
 
        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);
 
-       /*
-        * Byte swap ORB if necessary
-        */
        sbp2util_cpu_to_be32_buffer(scsi_id->login_orb, sizeof(struct sbp2_login_orb));
 
-       SBP2_DEBUG("sbp2_login_device: orb byte-swapped");
-
        sbp2util_packet_dump(scsi_id->login_orb, sizeof(struct sbp2_login_orb),
                             "sbp2 login orb", scsi_id->login_orb_dma);
 
-       /*
-        * Initialize login response and status fifo
-        */
        memset(scsi_id->login_response, 0, sizeof(struct sbp2_login_response));
        memset(&scsi_id->status_block, 0, sizeof(struct sbp2_status_block));
 
-       SBP2_DEBUG("sbp2_login_device: login_response/status FIFO memset");
-
-       /*
-        * 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->login_orb_dma;
        sbp2util_cpu_to_be32_buffer(data, 8);
 
        atomic_set(&scsi_id->sbp2_login_complete, 0);
 
-       SBP2_DEBUG("sbp2_login_device: prepared to write to %08x",
-                  (unsigned int)scsi_id->sbp2_management_agent_addr);
        hpsb_node_write(scsi_id->ne, scsi_id->sbp2_management_agent_addr, data, 8);
-       SBP2_DEBUG("sbp2_login_device: written");
 
        /*
         * Wait for login status (up to 20 seconds)...
@@ -1298,7 +1275,7 @@ static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id)
        quadlet_t data[2];
        int error;
 
-       SBP2_DEBUG("sbp2_logout_device");
+       SBP2_DEBUG_ENTER();
 
        /*
         * Set-up logout ORB
@@ -1362,7 +1339,7 @@ static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id)
        quadlet_t data[2];
        int error;
 
-       SBP2_DEBUG("sbp2_reconnect_device");
+       SBP2_DEBUG_ENTER();
 
        /*
         * Set-up reconnect ORB
@@ -1453,17 +1430,11 @@ static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id)
 {
        quadlet_t data;
 
-       SBP2_DEBUG("sbp2_set_busy_timeout");
+       SBP2_DEBUG_ENTER();
 
-       /*
-        * Ok, let's write to the target's busy timeout register
-        */
        data = cpu_to_be32(SBP2_BUSY_TIMEOUT_VALUE);
-
-       if (hpsb_node_write(scsi_id->ne, SBP2_BUSY_TIMEOUT_ADDRESS, &data, 4)) {
-               SBP2_ERR("sbp2_set_busy_timeout error");
-       }
-
+       if (hpsb_node_write(scsi_id->ne, SBP2_BUSY_TIMEOUT_ADDRESS, &data, 4))
+               SBP2_ERR("%s error", __FUNCTION__);
        return 0;
 }
 
@@ -1482,7 +1453,7 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
            firmware_revision, workarounds;
        int i;
 
-       SBP2_DEBUG("sbp2_parse_unit_directory");
+       SBP2_DEBUG_ENTER();
 
        management_agent_addr = 0x0;
        command_set_spec_id = 0x0;
@@ -1615,7 +1586,7 @@ static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id)
 {
        struct sbp2scsi_host_info *hi = scsi_id->hi;
 
-       SBP2_DEBUG("sbp2_max_speed_and_size");
+       SBP2_DEBUG_ENTER();
 
        /* Initial setting comes from the hosts speed map */
        scsi_id->speed_code =
@@ -1652,11 +1623,8 @@ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait)
        u64 addr;
        int retval;
 
-       SBP2_DEBUG("sbp2_agent_reset");
+       SBP2_DEBUG_ENTER();
 
-       /*
-        * Ok, let's write to the target's management agent register
-        */
        data = ntohl(SBP2_AGENT_RESET_DATA);
        addr = scsi_id->sbp2_command_block_agent_addr + SBP2_AGENT_RESET_OFFSET;
 
@@ -2004,11 +1972,7 @@ 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("sbp2_send_command");
-#if (CONFIG_IEEE1394_SBP2_DEBUG >= 2) || defined(CONFIG_IEEE1394_SBP2_PACKET_DUMP)
-       printk("[scsi command]\n   ");
-       scsi_print_command(SCpnt);
-#endif
+       SBP2_DEBUG_ENTER();
        SBP2_DEBUG("SCSI transfer size = %x", request_bufflen);
        SBP2_DEBUG("SCSI s/g elements = %x", (unsigned int)SCpnt->use_sg);
 
@@ -2048,7 +2012,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)
 {
-       SBP2_DEBUG("sbp2_status_to_sense_data");
+       SBP2_DEBUG_ENTER();
 
        /*
         * Ok, it's pretty ugly...   ;-)
@@ -2082,7 +2046,7 @@ static void sbp2_check_sbp2_response(struct scsi_id_instance_data *scsi_id,
 {
        u8 *scsi_buf = SCpnt->request_buffer;
 
-       SBP2_DEBUG("sbp2_check_sbp2_response");
+       SBP2_DEBUG_ENTER();
 
        if (SCpnt->cmnd[0] == INQUIRY && (SCpnt->cmnd[1] & 3) == 0) {
                /*
@@ -2113,7 +2077,7 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int dest
        struct sbp2_command_info *command;
        unsigned long flags;
 
-       SBP2_DEBUG("sbp2_handle_status_write");
+       SBP2_DEBUG_ENTER();
 
        sbp2util_packet_dump(data, length, "sbp2 status write by device", (u32)addr);
 
@@ -2177,7 +2141,9 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int dest
                 * Matched status with command, now grab scsi command pointers and check status
                 */
                SCpnt = command->Current_SCpnt;
+               spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
                sbp2util_mark_command_completed(scsi_id, command);
+               spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
 
                if (SCpnt) {
 
@@ -2260,7 +2226,10 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt,
        struct sbp2scsi_host_info *hi;
        int result = DID_NO_CONNECT << 16;
 
-       SBP2_DEBUG("sbp2scsi_queuecommand");
+       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;
@@ -2338,7 +2307,7 @@ static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id
        struct sbp2_command_info *command;
        unsigned long flags;
 
-       SBP2_DEBUG("sbp2scsi_complete_all_commands");
+       SBP2_DEBUG_ENTER();
 
        spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
        while (!list_empty(&scsi_id->sbp2_command_orb_inuse)) {
@@ -2371,7 +2340,7 @@ 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("sbp2scsi_complete_command");
+       SBP2_DEBUG_ENTER();
 
        /*
         * Sanity
@@ -2397,7 +2366,7 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
         */
        switch (scsi_status) {
        case SBP2_SCSI_STATUS_GOOD:
-               SCpnt->result = DID_OK;
+               SCpnt->result = DID_OK << 16;
                break;
 
        case SBP2_SCSI_STATUS_BUSY:
@@ -2407,16 +2376,11 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
 
        case SBP2_SCSI_STATUS_CHECK_CONDITION:
                SBP2_DEBUG("SBP2_SCSI_STATUS_CHECK_CONDITION");
-               SCpnt->result = CHECK_CONDITION << 1;
-
-               /*
-                * Debug stuff
-                */
+               SCpnt->result = CHECK_CONDITION << 1 | DID_OK << 16;
 #if CONFIG_IEEE1394_SBP2_DEBUG >= 1
                scsi_print_command(SCpnt);
-               scsi_print_sense("bh", SCpnt);
+               scsi_print_sense(SBP2_DEVICE_NAME, SCpnt);
 #endif
-
                break;
 
        case SBP2_SCSI_STATUS_SELECTION_TIMEOUT:
@@ -2441,7 +2405,7 @@ static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
        /*
         * Take care of any sbp2 response data mucking here (RBC stuff, etc.)
         */
-       if (SCpnt->result == DID_OK) {
+       if (SCpnt->result == DID_OK << 16) {
                sbp2_check_sbp2_response(scsi_id, SCpnt);
        }
 
@@ -2459,6 +2423,8 @@ 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) &&
@@ -2513,6 +2479,7 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt)
                (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
        struct sbp2scsi_host_info *hi = scsi_id->hi;
        struct sbp2_command_info *command;
+       unsigned long flags;
 
        SBP2_ERR("aborting sbp2 command");
        scsi_print_command(SCpnt);
@@ -2523,6 +2490,7 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt)
                 * Right now, just return any matching command structures
                 * 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) {
                        SBP2_DEBUG("Found command to abort");
@@ -2540,6 +2508,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);
 
                /*
                 * Initiate a fetch agent reset.
@@ -2624,7 +2593,7 @@ static int sbp2_module_init(void)
 {
        int ret;
 
-       SBP2_DEBUG("sbp2_module_init");
+       SBP2_DEBUG_ENTER();
 
        /* Module load debug option to force one command at a time (serializing I/O) */
        if (serialize_io) {
@@ -2652,7 +2621,7 @@ static int sbp2_module_init(void)
 
 static void __exit sbp2_module_exit(void)
 {
-       SBP2_DEBUG("sbp2_module_exit");
+       SBP2_DEBUG_ENTER();
 
        hpsb_unregister_protocol(&sbp2_driver);