]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ieee1394/sbp2.c
[PATCH] cciss: adds MSI and MSI-X support
[linux-2.6-omap-h63xx.git] / drivers / ieee1394 / sbp2.c
index 073ede9d3b480fecfac150e4d44779db3400ab8d..18d7eda388512d8abd3a841fe1727f257ed0d2f6 100644 (file)
@@ -80,9 +80,6 @@
 #include "ieee1394_transactions.h"
 #include "sbp2.h"
 
-static char version[] __devinitdata =
-       "$Rev: 1306 $ Ben Collins <bcollins@debian.org>";
-
 /*
  * Module load parameter definitions
  */
@@ -414,14 +411,12 @@ static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_i
 
        spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
        for (i = 0; i < orbs; i++) {
-               command = (struct sbp2_command_info *)
-                   kmalloc(sizeof(struct sbp2_command_info), GFP_ATOMIC);
+               command = kzalloc(sizeof(*command), GFP_ATOMIC);
                if (!command) {
                        spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock,
                                               flags);
                        return -ENOMEM;
                }
-               memset(command, '\0', sizeof(struct sbp2_command_info));
                command->command_orb_dma =
                    pci_map_single(hi->host->pdev, &command->command_orb,
                                   sizeof(struct sbp2_command_orb),
@@ -717,12 +712,11 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud
 
        SBP2_DEBUG("sbp2_alloc_device");
 
-       scsi_id = kmalloc(sizeof(*scsi_id), GFP_KERNEL);
+       scsi_id = kzalloc(sizeof(*scsi_id), GFP_KERNEL);
        if (!scsi_id) {
                SBP2_ERR("failed to create scsi_id");
                goto failed_alloc;
        }
-       memset(scsi_id, 0, sizeof(*scsi_id));
 
        scsi_id->ne = ud->ne;
        scsi_id->ud = ud;
@@ -862,56 +856,8 @@ static int sbp2_start_device(struct scsi_id_instance_data *scsi_id)
                pci_alloc_consistent(hi->host->pdev,
                                     sizeof(struct sbp2_login_orb),
                                     &scsi_id->login_orb_dma);
-       if (!scsi_id->login_orb) {
-alloc_fail:
-               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("query logins response DMA");
-               }
-
-               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("query logins ORB DMA");
-               }
-
-               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("logout ORB DMA");
-               }
-
-               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("reconnect ORB DMA");
-               }
-
-               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("login FIFO DMA");
-               }
-
-               list_del(&scsi_id->scsi_list);
-
-               kfree(scsi_id);
-
-               SBP2_ERR("Could not allocate memory for scsi_id");
-
-               return -ENOMEM;
-       }
+       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);
@@ -966,10 +912,17 @@ alloc_fail:
        error = scsi_add_device(scsi_id->scsi_host, 0, scsi_id->ud->id, 0);
        if (error) {
                SBP2_ERR("scsi_add_device failed");
+               sbp2_logout_device(scsi_id);
+               sbp2_remove_device(scsi_id);
                return error;
        }
 
        return 0;
+
+alloc_fail:
+       SBP2_ERR("Could not allocate memory for scsi_id");
+       sbp2_remove_device(scsi_id);
+       return -ENOMEM;
 }
 
 /*
@@ -1711,26 +1664,184 @@ static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait)
        return 0;
 }
 
+static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb,
+                                    struct sbp2scsi_host_info *hi,
+                                    struct sbp2_command_info *command,
+                                    unsigned int scsi_use_sg,
+                                    struct scatterlist *sgpnt,
+                                    u32 orb_direction,
+                                    enum dma_data_direction dma_dir)
+{
+       command->dma_dir = dma_dir;
+       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) */
+       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,
+                                               sgpnt[0].page,
+                                               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);
+
+       } else {
+               struct sbp2_unrestricted_page_table *sg_element =
+                                       &command->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);
+
+               SBP2_DMA_ALLOC("scatter list");
+
+               command->dma_size = scsi_use_sg;
+               command->sge_buffer = sgpnt;
+
+               /* use page tables (s/g) */
+               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)
+                */
+               for (i = 0, sg_count = 0 ; i < count; i++, sgpnt++) {
+                       sg_len = sg_dma_len(sgpnt);
+                       sg_addr = sg_dma_address(sgpnt);
+                       while (sg_len) {
+                               sg_element[sg_count].segment_base_lo = sg_addr;
+                               if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
+                                       sg_element[sg_count].length_segment_base_hi =
+                                               PAGE_TABLE_SET_SEGMENT_LENGTH(SBP2_MAX_SG_ELEMENT_LENGTH);
+                                       sg_addr += SBP2_MAX_SG_ELEMENT_LENGTH;
+                                       sg_len -= SBP2_MAX_SG_ELEMENT_LENGTH;
+                               } else {
+                                       sg_element[sg_count].length_segment_base_hi =
+                                               PAGE_TABLE_SET_SEGMENT_LENGTH(sg_len);
+                                       sg_len = 0;
+                               }
+                               sg_count++;
+                       }
+               }
+
+               /* 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)) *
+                                           sg_count);
+       }
+}
+
+static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb,
+                                       struct sbp2scsi_host_info *hi,
+                                       struct sbp2_command_info *command,
+                                       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);
+       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)
+        */
+       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 {
+               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)
+                */
+               sg_count = 0;
+               sg_len = scsi_request_bufflen;
+               sg_addr = command->cmd_dma;
+               while (sg_len) {
+                       sg_element[sg_count].segment_base_lo = sg_addr;
+                       if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
+                               sg_element[sg_count].length_segment_base_hi =
+                                       PAGE_TABLE_SET_SEGMENT_LENGTH(SBP2_MAX_SG_ELEMENT_LENGTH);
+                               sg_addr += SBP2_MAX_SG_ELEMENT_LENGTH;
+                               sg_len -= SBP2_MAX_SG_ELEMENT_LENGTH;
+                       } else {
+                               sg_element[sg_count].length_segment_base_hi =
+                                       PAGE_TABLE_SET_SEGMENT_LENGTH(sg_len);
+                               sg_len = 0;
+                       }
+                       sg_count++;
+               }
+
+               /* 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)) *
+                                            sg_count);
+       }
+}
+
 /*
  * This function is called to create the actual command orb and s/g list
  * out of the scsi command itself.
  */
-static int sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id,
-                                  struct sbp2_command_info *command,
-                                  unchar *scsi_cmd,
-                                  unsigned int scsi_use_sg,
-                                  unsigned int scsi_request_bufflen,
-                                  void *scsi_request_buffer,
-                                  enum dma_data_direction dma_dir)
+static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id,
+                                   struct sbp2_command_info *command,
+                                   unchar *scsi_cmd,
+                                   unsigned int scsi_use_sg,
+                                   unsigned int scsi_request_bufflen,
+                                   void *scsi_request_buffer,
+                                   enum dma_data_direction dma_dir)
 {
        struct sbp2scsi_host_info *hi = scsi_id->hi;
        struct scatterlist *sgpnt = (struct scatterlist *)scsi_request_buffer;
        struct sbp2_command_orb *command_orb = &command->command_orb;
-       struct sbp2_unrestricted_page_table *scatter_gather_element =
-               &command->scatter_gather_element[0];
-       u32 sg_count, sg_len, orb_direction;
-       dma_addr_t sg_addr;
-       int i;
+       u32 orb_direction;
 
        /*
         * Set-up our command ORB..
@@ -1746,220 +1857,40 @@ static int sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id,
        command_orb->misc |= ORB_SET_SPEED(scsi_id->speed_code);
        command_orb->misc |= ORB_SET_NOTIFY(1); /* Notify us when complete */
 
-       /*
-        * Get the direction of the transfer. If the direction is unknown, then use our
-        * goofy table as a back-up.
-        */
-       switch (dma_dir) {
-       case DMA_NONE:
+       if (dma_dir == DMA_NONE)
                orb_direction = ORB_DIRECTION_NO_DATA_TRANSFER;
-               break;
-       case DMA_TO_DEVICE:
+       else if (dma_dir == DMA_TO_DEVICE && scsi_request_bufflen)
                orb_direction = ORB_DIRECTION_WRITE_TO_MEDIA;
-               break;
-       case DMA_FROM_DEVICE:
+       else if (dma_dir == DMA_FROM_DEVICE && scsi_request_bufflen)
                orb_direction = ORB_DIRECTION_READ_FROM_MEDIA;
-               break;
-       case DMA_BIDIRECTIONAL:
-       default:
-               SBP2_ERR("SCSI data transfer direction not specified. "
-                        "Update the SBP2 direction table in sbp2.h if "
-                        "necessary for your application");
-               __scsi_print_command(scsi_cmd);
-               orb_direction = sbp2scsi_direction_table[*scsi_cmd];
-               break;
+       else {
+               SBP2_WARN("Falling back to DMA_NONE");
+               orb_direction = ORB_DIRECTION_NO_DATA_TRANSFER;
        }
 
-       /*
-        * Set-up our pagetable stuff... unfortunately, this has become
-        * messier than I'd like. Need to clean this up a bit.   ;-)
-        */
+       /* Set-up our pagetable stuff */
        if (orb_direction == ORB_DIRECTION_NO_DATA_TRANSFER) {
-
                SBP2_DEBUG("No data transfer");
-
-               /*
-                * Handle 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");
-
-               /*
-                * 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)) {
-
-                       SBP2_DEBUG("Only one s/g element");
-                       command->dma_dir = dma_dir;
-                       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);
-                       SBP2_DMA_ALLOC("single page scatter element");
-
-                       command_orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id);
-                       command_orb->data_descriptor_lo = command->cmd_dma;
-                       command_orb->misc |= ORB_SET_DATA_SIZE(command->dma_size);
-                       command_orb->misc |= ORB_SET_DIRECTION(orb_direction);
-
-               } else {
-                       int 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->dma_dir = dma_dir;
-                       command->sge_buffer = sgpnt;
-
-                       /* use page tables (s/g) */
-                       command_orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1);
-                       command_orb->misc |= ORB_SET_DIRECTION(orb_direction);
-                       command_orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id);
-                       command_orb->data_descriptor_lo = command->sge_dma;
-
-                       /*
-                        * 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);
-                               while (sg_len) {
-                                       scatter_gather_element[sg_count].segment_base_lo = sg_addr;
-                                       if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
-                                               scatter_gather_element[sg_count].length_segment_base_hi =
-                                                       PAGE_TABLE_SET_SEGMENT_LENGTH(SBP2_MAX_SG_ELEMENT_LENGTH);
-                                               sg_addr += SBP2_MAX_SG_ELEMENT_LENGTH;
-                                               sg_len -= SBP2_MAX_SG_ELEMENT_LENGTH;
-                                       } else {
-                                               scatter_gather_element[sg_count].length_segment_base_hi =
-                                                       PAGE_TABLE_SET_SEGMENT_LENGTH(sg_len);
-                                               sg_len = 0;
-                                       }
-                                       sg_count++;
-                               }
-                       }
-
-                       /* Number of page table (s/g) elements */
-                       command_orb->misc |= ORB_SET_DATA_SIZE(sg_count);
-
-                       sbp2util_packet_dump(scatter_gather_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(scatter_gather_element,
-                                                   (sizeof(struct sbp2_unrestricted_page_table)) *
-                                                   sg_count);
-
-               }
-
+               sbp2_prep_command_orb_sg(command_orb, hi, command, scsi_use_sg,
+                                        sgpnt, orb_direction, dma_dir);
        } else {
-
                SBP2_DEBUG("No scatter/gather");
-
-               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);
-               SBP2_DMA_ALLOC("single bulk");
-
-               /*
-                * 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) {
-
-                       command_orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id);
-                       command_orb->data_descriptor_lo = command->cmd_dma;
-                       command_orb->misc |= ORB_SET_DATA_SIZE(scsi_request_bufflen);
-                       command_orb->misc |= ORB_SET_DIRECTION(orb_direction);
-
-                       /*
-                        * Sanity, in case our direction table is not
-                        * up-to-date
-                        */
-                       if (!scsi_request_bufflen) {
-                               command_orb->data_descriptor_hi = 0x0;
-                               command_orb->data_descriptor_lo = 0x0;
-                               command_orb->misc |= ORB_SET_DIRECTION(1);
-                       }
-
-               } else {
-                       /*
-                        * Need to turn this into page tables, since the
-                        * buffer is too large.
-                        */
-                       command_orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id);
-                       command_orb->data_descriptor_lo = command->sge_dma;
-
-                       /* Use page tables (s/g) */
-                       command_orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1);
-                       command_orb->misc |= ORB_SET_DIRECTION(orb_direction);
-
-                       /*
-                        * fill out our sbp-2 page tables (and split up
-                        * the large buffer)
-                        */
-                       sg_count = 0;
-                       sg_len = scsi_request_bufflen;
-                       sg_addr = command->cmd_dma;
-                       while (sg_len) {
-                               scatter_gather_element[sg_count].segment_base_lo = sg_addr;
-                               if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
-                                       scatter_gather_element[sg_count].length_segment_base_hi =
-                                               PAGE_TABLE_SET_SEGMENT_LENGTH(SBP2_MAX_SG_ELEMENT_LENGTH);
-                                       sg_addr += SBP2_MAX_SG_ELEMENT_LENGTH;
-                                       sg_len -= SBP2_MAX_SG_ELEMENT_LENGTH;
-                               } else {
-                                       scatter_gather_element[sg_count].length_segment_base_hi =
-                                               PAGE_TABLE_SET_SEGMENT_LENGTH(sg_len);
-                                       sg_len = 0;
-                               }
-                               sg_count++;
-                       }
-
-                       /* Number of page table (s/g) elements */
-                       command_orb->misc |= ORB_SET_DATA_SIZE(sg_count);
-
-                       sbp2util_packet_dump(scatter_gather_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(scatter_gather_element,
-                                                   (sizeof(struct sbp2_unrestricted_page_table)) *
-                                                    sg_count);
-
-               }
-
+               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
-        */
+       /* 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
-        */
+       /* Put our scsi command in the command ORB */
        memset(command_orb->cdb, 0, 12);
        memcpy(command_orb->cdb, scsi_cmd, COMMAND_SIZE(*scsi_cmd));
-
-       return 0;
 }
 
 /*
@@ -2376,6 +2307,16 @@ static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt,
                goto done;
        }
 
+       /*
+        * 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
         */
@@ -2615,27 +2556,17 @@ 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];
-       unsigned long flags;
 
        SBP2_ERR("reset requested");
 
-       spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
-
        if (sbp2util_node_is_available(scsi_id)) {
                SBP2_ERR("Generating sbp2 fetch agent reset");
                sbp2_agent_reset(scsi_id, 0);
        }
 
-       spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
-
        return SUCCESS;
 }
 
-static const char *sbp2scsi_info(struct Scsi_Host *host)
-{
-       return "SCSI emulation for IEEE-1394 SBP-2 Devices";
-}
-
 static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev,
                                           struct device_attribute *attr,
                                           char *buf)
@@ -2672,12 +2603,9 @@ static struct scsi_host_template scsi_driver_template = {
        .module =                       THIS_MODULE,
        .name =                         "SBP-2 IEEE-1394",
        .proc_name =                    SBP2_DEVICE_NAME,
-       .info =                         sbp2scsi_info,
        .queuecommand =                 sbp2scsi_queuecommand,
        .eh_abort_handler =             sbp2scsi_abort,
        .eh_device_reset_handler =      sbp2scsi_reset,
-       .eh_bus_reset_handler =         sbp2scsi_reset,
-       .eh_host_reset_handler =        sbp2scsi_reset,
        .slave_alloc =                  sbp2scsi_slave_alloc,
        .slave_configure =              sbp2scsi_slave_configure,
        .slave_destroy =                sbp2scsi_slave_destroy,
@@ -2696,8 +2624,6 @@ static int sbp2_module_init(void)
 
        SBP2_DEBUG("sbp2_module_init");
 
-       printk(KERN_INFO "sbp2: %s\n", version);
-
        /* 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)");