Re: [PATCH] qla4xxx: allow hba to be online when initiator ip address is uninitialized

2007-06-14 Thread David C Somayajulu
On Thu, 2007-06-14 at 01:54 -0400, Mike Christie wrote:
 David C Somayajulu wrote:
  On Fri, 2007-06-08 at 17:29 -0700, David C Somayajulu wrote:
  This patch provides the following:
  1. remove warning ignoring the return value of pci_set_mwi()
  2. allows HBA to be online when the initiator ip address is uninitialized.
  Including 
  
  Signed-off-by: David Somayajulu [EMAIL PROTECTED]
  
   drivers/scsi/qla4xxx/ql4_init.c |   23 +++
   1 files changed, 11 insertions(+), 12 deletions(-)
  
  diff --git a/drivers/scsi/qla4xxx/ql4_init.c 
  b/drivers/scsi/qla4xxx/ql4_init.c
  index d8c064c..1e29f51 100644
  --- a/drivers/scsi/qla4xxx/ql4_init.c
  +++ b/drivers/scsi/qla4xxx/ql4_init.c
  @@ -883,11 +883,12 @@ static int qla4xxx_config_nvram(struct s
   static void qla4x00_pci_config(struct scsi_qla_host *ha)
   {
  uint16_t w;
  +   int status;
   
  dev_info(ha-pdev-dev, Configuring PCI space...\n);
   
  pci_set_master(ha-pdev);
  -   pci_set_mwi(ha-pdev);
  +   status = pci_set_mwi(ha-pdev);
 
 
 It looks ok, but creating the status variable and setting it like this,
 just to quiet the compile warning, and never doing anything else with it
 doesn't seem nice.
I don't like it either. I tried with 
(void)pci_set_mwi(ha-pdev); 
and this is what I see

  CC [M]  drivers/scsi/qla4xxx/ql4_init.o
drivers/scsi/qla4xxx/ql4_init.c: In function ‘qla4x00_pci_config’:
drivers/scsi/qla4xxx/ql4_init.c:890: warning: ignoring return value of 
‘pci_set_mwi’, declared with attribute warn_unused_result
  LD [M]  drivers/scsi/qla4xxx/qla4xxx.o


-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] qla4xxx: allow hba to be online when initiator ip address is uninitialized

2007-06-08 Thread David C Somayajulu
This patch provides the following:
1. remove warning ignoring the return value of pci_set_mwi()
2. allows HBA to be online when the initiator ip address is uninitialized.

 drivers/scsi/qla4xxx/ql4_init.c |   23 +++
 1 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c
index d8c064c..1e29f51 100644
--- a/drivers/scsi/qla4xxx/ql4_init.c
+++ b/drivers/scsi/qla4xxx/ql4_init.c
@@ -883,11 +883,12 @@ static int qla4xxx_config_nvram(struct s
 static void qla4x00_pci_config(struct scsi_qla_host *ha)
 {
uint16_t w;
+   int status;
 
dev_info(ha-pdev-dev, Configuring PCI space...\n);
 
pci_set_master(ha-pdev);
-   pci_set_mwi(ha-pdev);
+   status = pci_set_mwi(ha-pdev);
/*
 * We want to respect framework's setting of PCI configuration space
 * command register and also want to make sure that all bits of
@@ -1143,32 +1144,30 @@ int qla4xxx_initialize_adapter(struct sc
 
/* Initialize the Host adapter request/response queues and firmware */
if (qla4xxx_start_firmware(ha) == QLA_ERROR)
-   return status;
+   goto exit_init_hba;
 
if (qla4xxx_validate_mac_address(ha) == QLA_ERROR)
-   return status;
+   goto exit_init_hba;
 
if (qla4xxx_init_local_data(ha) == QLA_ERROR)
-   return status;
+   goto exit_init_hba;
 
status = qla4xxx_init_firmware(ha);
if (status == QLA_ERROR)
-   return status;
+   goto exit_init_hba;
 
/*
 * FW is waiting to get an IP address from DHCP server: Skip building
 * the ddb_list and wait for DHCP lease acquired aen to come in
 * followed by 0x8014 aen to trigger the tgt discovery process.
 */
-   if (ha-firmware_state  FW_STATE_DHCP_IN_PROGRESS){
-   set_bit(AF_ONLINE, ha-flags);
-   return status;
-   }
+   if (ha-firmware_state  FW_STATE_DHCP_IN_PROGRESS)
+   goto exit_init_online;
 
/* Skip device discovery if ip and subnet is zero */
if (memcmp(ha-ip_address, ip_address, IP_ADDR_LEN) == 0 ||
memcmp(ha-subnet_mask, ip_address, IP_ADDR_LEN) == 0)
-   return status;
+   goto exit_init_online;
 
if (renew_ddb_list == PRESERVE_DDB_LIST) {
/*
@@ -1197,10 +1196,10 @@ int qla4xxx_initialize_adapter(struct sc
  ha-host_no));
}
 
+exit_init_online:
set_bit(AF_ONLINE, ha-flags);
- exit_init_hba:
+exit_init_hba:
return status;
-
 }
 
 /**

-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] qla4xxx: allow hba to be online when initiator ip address is uninitialized

2007-06-08 Thread David C Somayajulu
On Fri, 2007-06-08 at 17:29 -0700, David C Somayajulu wrote:
 This patch provides the following:
 1. remove warning ignoring the return value of pci_set_mwi()
 2. allows HBA to be online when the initiator ip address is uninitialized.
Including 

Signed-off-by: David Somayajulu [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_init.c |   23 +++
 1 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c
index d8c064c..1e29f51 100644
--- a/drivers/scsi/qla4xxx/ql4_init.c
+++ b/drivers/scsi/qla4xxx/ql4_init.c
@@ -883,11 +883,12 @@ static int qla4xxx_config_nvram(struct s
 static void qla4x00_pci_config(struct scsi_qla_host *ha)
 {
uint16_t w;
+   int status;
 
dev_info(ha-pdev-dev, Configuring PCI space...\n);
 
pci_set_master(ha-pdev);
-   pci_set_mwi(ha-pdev);
+   status = pci_set_mwi(ha-pdev);
/*
 * We want to respect framework's setting of PCI configuration space
 * command register and also want to make sure that all bits of
@@ -1143,32 +1144,30 @@ int qla4xxx_initialize_adapter(struct sc
 
/* Initialize the Host adapter request/response queues and firmware */
if (qla4xxx_start_firmware(ha) == QLA_ERROR)
-   return status;
+   goto exit_init_hba;
 
if (qla4xxx_validate_mac_address(ha) == QLA_ERROR)
-   return status;
+   goto exit_init_hba;
 
if (qla4xxx_init_local_data(ha) == QLA_ERROR)
-   return status;
+   goto exit_init_hba;
 
status = qla4xxx_init_firmware(ha);
if (status == QLA_ERROR)
-   return status;
+   goto exit_init_hba;
 
/*
 * FW is waiting to get an IP address from DHCP server: Skip building
 * the ddb_list and wait for DHCP lease acquired aen to come in
 * followed by 0x8014 aen to trigger the tgt discovery process.
 */
-   if (ha-firmware_state  FW_STATE_DHCP_IN_PROGRESS){
-   set_bit(AF_ONLINE, ha-flags);
-   return status;
-   }
+   if (ha-firmware_state  FW_STATE_DHCP_IN_PROGRESS)
+   goto exit_init_online;
 
/* Skip device discovery if ip and subnet is zero */
if (memcmp(ha-ip_address, ip_address, IP_ADDR_LEN) == 0 ||
memcmp(ha-subnet_mask, ip_address, IP_ADDR_LEN) == 0)
-   return status;
+   goto exit_init_online;
 
if (renew_ddb_list == PRESERVE_DDB_LIST) {
/*
@@ -1197,10 +1196,10 @@ int qla4xxx_initialize_adapter(struct sc
  ha-host_no));
}
 
+exit_init_online:
set_bit(AF_ONLINE, ha-flags);
- exit_init_hba:
+exit_init_hba:
return status;
-
 }
 
 /**

-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] qla4xxx: Fix underrun/overrun conditions

2007-06-06 Thread David C Somayajulu
This patch fixes the code handling underrun and overrun conditions.

Signed-off-by: David Somayajulu [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_isr.c |   57 
 drivers/scsi/qla4xxx/ql4_version.h |2 +-
 2 files changed, 33 insertions(+), 26 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
index b47bd85..fa8a477 100644
--- a/drivers/scsi/qla4xxx/ql4_isr.c
+++ b/drivers/scsi/qla4xxx/ql4_isr.c
@@ -93,9 +93,29 @@ static void qla4xxx_status_entry(struct
break;
}
 
-   if (sts_entry-iscsiFlags 
-   (ISCSI_FLAG_RESIDUAL_OVER|ISCSI_FLAG_RESIDUAL_UNDER))
+   if (sts_entry-iscsiFlags  ISCSI_FLAG_RESIDUAL_OVER) {
+   cmd-result = DID_ERROR  16;
+   break;
+   }
+
+   if (sts_entry-iscsiFlags ISCSI_FLAG_RESIDUAL_UNDER) {
scsi_set_resid(cmd, residual);
+   if (!scsi_status  ((scsi_bufflen(cmd) - residual)
+cmd-underflow)) {
+
+   cmd-result = DID_ERROR  16;
+
+   DEBUG2(printk(scsi%ld:%d:%d:%d: %s: 
+   Mid-layer Data underrun0, 
+   xferlen = 0x%x, 
+   residual = 0x%x\n, ha-host_no,
+   cmd-device-channel,
+   cmd-device-id,
+   cmd-device-lun, __func__,
+   scsi_bufflen(cmd), residual));
+   break;
+   }
+   }
 
cmd-result = DID_OK  16 | scsi_status;
 
@@ -164,7 +184,8 @@ static void qla4xxx_status_entry(struct
 
case SCS_DATA_UNDERRUN:
case SCS_DATA_OVERRUN:
-   if (sts_entry-iscsiFlags  ISCSI_FLAG_RESIDUAL_OVER) {
+   if ((sts_entry-iscsiFlags  ISCSI_FLAG_RESIDUAL_OVER) ||
+   (sts_entry-completionStatus == SCS_DATA_OVERRUN)) {
DEBUG2(printk(scsi%ld:%d:%d:%d: %s:  Data overrun, 
  residual = 0x%x\n, ha-host_no,
  cmd-device-channel, cmd-device-id,
@@ -174,21 +195,7 @@ static void qla4xxx_status_entry(struct
break;
}
 
-   if ((sts_entry-iscsiFlags  ISCSI_FLAG_RESIDUAL_UNDER) == 0) {
-   /*
-* Firmware detected a SCSI transport underrun
-* condition
-*/
-   scsi_set_resid(cmd, residual);
-   DEBUG2(printk(scsi%ld:%d:%d:%d: %s: UNDERRUN status 
- detected, xferlen = 0x%x, residual = 
- 0x%x\n,
- ha-host_no, cmd-device-channel,
- cmd-device-id,
- cmd-device-lun, __func__,
- scsi_bufflen(cmd),
- residual));
-   }
+   scsi_set_resid(cmd, residual);
 
/*
 * If there is scsi_status, it takes precedense over
@@ -245,13 +252,13 @@ static void qla4xxx_status_entry(struct
 * will return DID_ERROR.
 */
DEBUG2(printk(scsi%ld:%d:%d:%d: %s: 
- Mid-layer Data underrun, 
- xferlen = 0x%x, 
- residual = 0x%x\n, ha-host_no,
- cmd-device-channel,
- cmd-device-id,
- cmd-device-lun, __func__,
- scsi_bufflen(cmd), residual));
+   Mid-layer Data underrun1, 
+   xferlen = 0x%x, 
+   residual = 0x%x\n, ha-host_no,
+   cmd-device-channel,
+   cmd-device-id,
+   cmd-device-lun, __func__,
+   scsi_bufflen(cmd), residual));
 
cmd-result = DID_ERROR  16;
} else {
diff --git a/drivers/scsi/qla4xxx/ql4_version.h 
b/drivers/scsi/qla4xxx/ql4_version.h
index 2149069..ab984cb 100644
--- a/drivers/scsi/qla4xxx/ql4_version.h
+++ b/drivers/scsi/qla4xxx/ql4_version.h
@@ -5,5 +5,5 @@
  * See LICENSE.qla4xxx for copyright and licensing details.
 

[PATCH 0/8] qla4xxx: Resubmission of patches to add IPv6 support etc

2007-05-23 Thread David C Somayajulu
This series of patches is a resubmission of the previous patch under the title 
[RFC] [PATCH]  qla4xxx: Updated add IPv6 and misc support bugfixes cleanup as 
set of smaller patches per Mike Christie's advice/feedback. They contain the 
following:
1. Support for IPv6 and QLA4032.
2. Bug fixes and clean up to confirm to linux coding style.

Thanks
David Somayajulu 
Qlogic Corporation
-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/8] qla4xxx: Resubmission: ql4_dbg.c remove dead code

2007-05-23 Thread David C Somayajulu
Remove dead code

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_dbg.c |  174 +---
 1 files changed, 3 insertions(+), 171 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_dbg.c b/drivers/scsi/qla4xxx/ql4_dbg.c
index 6437d02..fcc184c 100644
--- a/drivers/scsi/qla4xxx/ql4_dbg.c
+++ b/drivers/scsi/qla4xxx/ql4_dbg.c
@@ -6,176 +6,9 @@
  */
 
 #include ql4_def.h
-#include scsi/scsi_dbg.h
-
-#if 0
-
-static void qla4xxx_print_srb_info(struct srb * srb)
-{
-   printk(%s: srb = 0x%p, flags=0x%02x\n, __func__, srb, srb-flags);
-   printk(%s: cmd = 0x%p, saved_dma_handle = 0x%lx\n,
-  __func__, srb-cmd, (unsigned long) srb-dma_handle);
-   printk(%s: fw_ddb_index = %d, lun = %d\n,
-  __func__, srb-fw_ddb_index, srb-cmd-device-lun);
-   printk(%s: iocb_tov = %d\n,
-  __func__, srb-iocb_tov);
-   printk(%s: cc_stat = 0x%x, r_start = 0x%lx, u_start = 0x%lx\n\n,
-  __func__, srb-cc_stat, srb-r_start, srb-u_start);
-}
-
-void qla4xxx_print_scsi_cmd(struct scsi_cmnd *cmd)
-{
-   printk(SCSI Command = 0x%p, Handle=0x%p\n, cmd, cmd-host_scribble);
-   printk(  b=%d, t=%02xh, l=%02xh, cmd_len = %02xh\n,
-  cmd-device-channel, cmd-device-id, cmd-device-lun,
-  cmd-cmd_len);
-   scsi_print_command(cmd);
-   printk(  seg_cnt = %d\n, cmd-use_sg);
-   printk(  request buffer = 0x%p, request buffer len = 0x%x\n,
-  cmd-request_buffer, cmd-request_bufflen);
-   if (cmd-use_sg) {
-   struct scatterlist *sg;
-   sg = (struct scatterlist *)cmd-request_buffer;
-   printk(  SG buffer: \n);
-   qla4xxx_dump_buffer((caddr_t) sg,
-   (cmd-use_sg * sizeof(*sg)));
-   }
-   printk(  tag = %d, transfersize = 0x%x \n, cmd-tag,
-  cmd-transfersize);
-   printk(  Pid = %d, SP = 0x%p\n, (int)cmd-pid, cmd-SCp.ptr);
-   printk(  underflow size = 0x%x, direction=0x%x\n, cmd-underflow,
-  cmd-sc_data_direction);
-   printk(  Current time (jiffies) = 0x%lx, 
-  timeout expires = 0x%lx\n, jiffies, cmd-eh_timeout.expires);
-   qla4xxx_print_srb_info((struct srb *) cmd-SCp.ptr);
-}
-
-void __dump_registers(struct scsi_qla_host *ha)
-{
-   uint8_t i;
-   for (i = 0; i  MBOX_REG_COUNT; i++) {
-   printk(KERN_INFO 0x%02X mailbox[%d]  = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg, mailbox[i]), i,
-  readw(ha-reg-mailbox[i]));
-   }
-   printk(KERN_INFO 0x%02X flash_address   = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg, flash_address),
-  readw(ha-reg-flash_address));
-   printk(KERN_INFO 0x%02X flash_data  = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg, flash_data),
-  readw(ha-reg-flash_data));
-   printk(KERN_INFO 0x%02X ctrl_status = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg, ctrl_status),
-  readw(ha-reg-ctrl_status));
-   if (is_qla4010(ha)) {
-   printk(KERN_INFO 0x%02X nvram   = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg, u1.isp4010.nvram),
-  readw(ha-reg-u1.isp4010.nvram));
-   }
-
-   else if (is_qla4022(ha) | is_qla4032(ha)) {
-   printk(KERN_INFO 0x%02X intr_mask   = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg,
- u1.isp4022.intr_mask),
-  readw(ha-reg-u1.isp4022.intr_mask));
-   printk(KERN_INFO 0x%02X nvram   = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg, u1.isp4022.nvram),
-  readw(ha-reg-u1.isp4022.nvram));
-   printk(KERN_INFO 0x%02X semaphore   = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg,
- u1.isp4022.semaphore),
-  readw(ha-reg-u1.isp4022.semaphore));
-   }
-   printk(KERN_INFO 0x%02X req_q_in= 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg, req_q_in),
-  readw(ha-reg-req_q_in));
-   printk(KERN_INFO 0x%02X rsp_q_out   = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg, rsp_q_out),
-  readw(ha-reg-rsp_q_out));
-   if (is_qla4010(ha)) {
-   printk(KERN_INFO 0x%02X ext_hw_conf = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg,
- u2.isp4010.ext_hw_conf),
-  readw(ha-reg-u2.isp4010.ext_hw_conf));
-   printk(KERN_INFO 0x%02X port_ctrl   = 0x%08X\n,
-  (uint8_t) offsetof(struct isp_reg,
- u2.isp4010.port_ctrl),
-  

[PATCH 2/8] qla4xxx: Resubmission: ql4_def.h log all AENs and cleanup

2007-05-23 Thread David C Somayajulu
Add support for logging all AENs and clean up

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_def.h |   78 
 1 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
index 6f4cf2d..accaf69 100644
--- a/drivers/scsi/qla4xxx/ql4_def.h
+++ b/drivers/scsi/qla4xxx/ql4_def.h
@@ -122,8 +122,7 @@ #define MAX_REQS_SERVICED_PER_INTR  16
 
 #define ISCSI_IPADDR_SIZE  4   /* IP address size */
 #define ISCSI_ALIAS_SIZE   32  /* ISCSI Alais name size */
-#define ISCSI_NAME_SIZE255 /* ISCSI Name size -
-* usually a string */
+#define ISCSI_NAME_SIZE0xE0/* ISCSI Name size */
 
 #define LSDW(x) ((u32)((u64)(x)))
 #define MSDW(x) ((u32)u64)(x))  16)  16))
@@ -187,9 +186,21 @@ #define SRB_ERR_OTHER 4
u_long u_start; /* Time when we handed the cmd to F/W */
 };
 
-   /*
-* Device Database (DDB) structure
-*/
+/*
+ * Asynchronous Event Queue structure
+ */
+struct aen {
+uint32_t mbox_sts[MBOX_AEN_REG_COUNT];
+};
+
+struct ql4_aen_log {
+int count;
+struct aen entry[MAX_AEN_ENTRIES];
+};
+
+/*
+ * Device Database (DDB) structure
+ */
 struct ddb_entry {
struct list_head list;  /* ddb list */
struct scsi_qla_host *ha;
@@ -254,13 +265,6 @@ #define DF_NO_RELOGIN  1   /* Do not relog
 #define DF_ISNS_DISCOVERED 2   /* Device was discovered via iSNS */
 #define DF_FO_MASKED   3
 
-/*
- * Asynchronous Event Queue structure
- */
-struct aen {
-   uint32_t mbox_sts[MBOX_AEN_REG_COUNT];
-};
-
 
 #include ql4_fw.h
 #include ql4_nvram.h
@@ -270,31 +274,31 @@ #include ql4_nvram.h
  */
 struct scsi_qla_host {
/* Linux adapter configuration data */
-   struct Scsi_Host *host; /* pointer to host data */
-   uint32_t tot_ddbs;
unsigned long flags;
 
-#define AF_ONLINE0 /* 0x0001 */
-#define AF_INIT_DONE 1 /* 0x0002 */
-#define AF_MBOX_COMMAND  2 /* 0x0004 */
-#define AF_MBOX_COMMAND_DONE 3 /* 0x0008 */
-#define AF_INTERRUPTS_ON 6 /* 0x0040 Not Used */
-#define AF_GET_CRASH_RECORD  7 /* 0x0080 */
-#define AF_LINK_UP   8 /* 0x0100 */
-#define AF_IRQ_ATTACHED 10 /* 0x0400 */
-#define AF_ISNS_CMD_IN_PROCESS  12 /* 0x1000 */
-#define AF_ISNS_CMD_DONE13 /* 0x2000 */
+#define AF_ONLINE  0 /* 0x0001 */
+#define AF_INIT_DONE   1 /* 0x0002 */
+#define AF_MBOX_COMMAND2 /* 0x0004 */
+#define AF_MBOX_COMMAND_DONE   3 /* 0x0008 */
+#define AF_INTERRUPTS_ON   6 /* 0x0040 */
+#define AF_GET_CRASH_RECORD7 /* 0x0080 */
+#define AF_LINK_UP 8 /* 0x0100 */
+#define AF_IRQ_ATTACHED10 /* 0x0400 */
+#define AF_DISABLE_ACB_COMPLETE11 /* 0x0800 */
 
unsigned long dpc_flags;
 
-#define DPC_RESET_HA 1 /* 0x0002 */
-#define DPC_RETRY_RESET_HA   2 /* 0x0004 */
-#define DPC_RELOGIN_DEVICE   3 /* 0x0008 */
-#define DPC_RESET_HA_DESTROY_DDB_LIST 4 /* 0x0010 */
-#define DPC_RESET_HA_INTR5 /* 0x0020 */
-#define DPC_ISNS_RESTART 7 /* 0x0080 */
-#define DPC_AEN  9 /* 0x0200 */
-#define DPC_GET_DHCP_IP_ADDR15 /* 0x8000 */
+#define DPC_RESET_HA   1 /* 0x0002 */
+#define DPC_RETRY_RESET_HA 2 /* 0x0004 */
+#define DPC_RELOGIN_DEVICE 3 /* 0x0008 */
+#define DPC_RESET_HA_DESTROY_DDB_LIST  4 /* 0x0010 */
+#define DPC_RESET_HA_INTR  5 /* 0x0020 */
+#define DPC_ISNS_RESTART   7 /* 0x0080 */
+#define DPC_AEN9 /* 0x0200 */
+#define DPC_GET_DHCP_IP_ADDR   15 /* 0x8000 */
+
+   struct Scsi_Host *host; /* pointer to host data */
+   uint32_t tot_ddbs;
 
uint16_tiocb_cnt;
uint16_tiocb_hiwat;
@@ -344,6 +348,7 @@ #define MIN_IOBASE_LEN  0x100
uint32_t firmware_version[2];
uint32_t patch_number;
uint32_t build_number;
+   uint32_t board_id;
 
/* --- From Init_FW --- */
/* init_cb_t *init_cb; */
@@ -363,7 +368,6 @@ #define MIN_IOBASE_LEN  0x100
 
/* --- From GetFwState --- */
uint32_t firmware_state;
-   uint32_t board_id;
uint32_t addl_fw_state;
 
/* Linux kernel thread */
@@ -414,6 +418,8 @@ #define MEM_ALIGN_VALUE \
uint16_t aen_out;
struct aen 

[PATCH 3/8] qla4xxx: Resubmission: ql4_fw.h add support for qla4032

2007-05-23 Thread David C Somayajulu
Add support for QLA4032 which supports IPv6

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_fw.h |  426 +
 1 files changed, 177 insertions(+), 249 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_fw.h b/drivers/scsi/qla4xxx/ql4_fw.h
index 4eea8c5..9bb3d1d 100644
--- a/drivers/scsi/qla4xxx/ql4_fw.h
+++ b/drivers/scsi/qla4xxx/ql4_fw.h
@@ -20,143 +20,23 @@ #define MAX_DEV_DB_ENTRIES 512
  */
 
 struct port_ctrl_stat_regs {
-   __le32 ext_hw_conf; /*  80 x50  R/W */
-   __le32 intChipConfiguration; /*  84 x54 */
-   __le32 port_ctrl;   /*  88 x58 */
-   __le32 port_status; /*  92 x5c */
-   __le32 HostPrimMACHi;   /*  96 x60 */
-   __le32 HostPrimMACLow;  /* 100 x64 */
-   __le32 HostSecMACHi;/* 104 x68 */
-   __le32 HostSecMACLow;   /* 108 x6c */
-   __le32 EPPrimMACHi; /* 112 x70 */
-   __le32 EPPrimMACLow;/* 116 x74 */
-   __le32 EPSecMACHi;  /* 120 x78 */
-   __le32 EPSecMACLow; /* 124 x7c */
-   __le32 HostPrimIPHi;/* 128 x80 */
-   __le32 HostPrimIPMidHi; /* 132 x84 */
-   __le32 HostPrimIPMidLow;/* 136 x88 */
-   __le32 HostPrimIPLow;   /* 140 x8c */
-   __le32 HostSecIPHi; /* 144 x90 */
-   __le32 HostSecIPMidHi;  /* 148 x94 */
-   __le32 HostSecIPMidLow; /* 152 x98 */
-   __le32 HostSecIPLow;/* 156 x9c */
-   __le32 EPPrimIPHi;  /* 160 xa0 */
-   __le32 EPPrimIPMidHi;   /* 164 xa4 */
-   __le32 EPPrimIPMidLow;  /* 168 xa8 */
-   __le32 EPPrimIPLow; /* 172 xac */
-   __le32 EPSecIPHi;   /* 176 xb0 */
-   __le32 EPSecIPMidHi;/* 180 xb4 */
-   __le32 EPSecIPMidLow;   /* 184 xb8 */
-   __le32 EPSecIPLow;  /* 188 xbc */
-   __le32 IPReassemblyTimeout; /* 192 xc0 */
-   __le32 EthMaxFramePayload; /* 196 xc4 */
-   __le32 TCPMaxWindowSize; /* 200 xc8 */
-   __le32 TCPCurrentTimestampHi; /* 204 xcc */
-   __le32 TCPCurrentTimestampLow; /* 208 xd0 */
-   __le32 LocalRAMAddress; /* 212 xd4 */
-   __le32 LocalRAMData;/* 216 xd8 */
-   __le32 PCSReserved1;/* 220 xdc */
-   __le32 gp_out;  /* 224 xe0 */
-   __le32 gp_in;   /* 228 xe4 */
-   __le32 ProbeMuxAddr;/* 232 xe8 */
-   __le32 ProbeMuxData;/* 236 xec */
-   __le32 ERMQueueBaseAddr0; /* 240 xf0 */
-   __le32 ERMQueueBaseAddr1; /* 244 xf4 */
-   __le32 MACConfiguration; /* 248 xf8 */
-   __le32 port_err_status; /* 252 xfc  COR */
+   __le32 ext_hw_conf; /* 0x50  R/W */
+   __le32 rsrvd0;  /* 0x54 */
+   __le32 port_ctrl;   /* 0x58 */
+   __le32 port_status; /* 0x5c */
+   __le32 rsrvd1[32];  /* 0x60-0xdf */
+   __le32 gp_out;  /* 0xe0 */
+   __le32 gp_in;   /* 0xe4 */
+   __le32 rsrvd2[5];   /* 0xe8-0xfb */
+   __le32 port_err_status; /* 0xfc */
 };
 
 struct host_mem_cfg_regs {
-   __le32 NetRequestQueueOut; /*  80 x50 */
-   __le32 NetRequestQueueOutAddrHi; /*  84 x54 */
-   __le32 NetRequestQueueOutAddrLow; /*  88 x58 */
-   __le32 NetRequestQueueBaseAddrHi; /*  92 x5c */
-   __le32 NetRequestQueueBaseAddrLow; /*  96 x60 */
-   __le32 NetRequestQueueLength; /* 100 x64 */
-   __le32 NetResponseQueueIn; /* 104 x68 */
-   __le32 NetResponseQueueInAddrHi; /* 108 x6c */
-   __le32 NetResponseQueueInAddrLow; /* 112 x70 */
-   __le32 NetResponseQueueBaseAddrHi; /* 116 x74 */
-   __le32 NetResponseQueueBaseAddrLow; /* 120 x78 */
-   __le32 NetResponseQueueLength; /* 124 x7c */
-   __le32 req_q_out;   /* 128 x80 */
-   __le32 RequestQueueOutAddrHi; /* 132 x84 */
-   __le32 RequestQueueOutAddrLow; /* 136 x88 */
-   __le32 RequestQueueBaseAddrHi; /* 140 x8c */
-   __le32 RequestQueueBaseAddrLow; /* 144 x90 */
-   __le32 RequestQueueLength; /* 148 x94 */
-   __le32 ResponseQueueIn; /* 152 x98 */
-   __le32 ResponseQueueInAddrHi; /* 156 x9c */
-   __le32 ResponseQueueInAddrLow; /* 160 xa0 */
-   __le32 ResponseQueueBaseAddrHi; /* 164 xa4 */
-   __le32 ResponseQueueBaseAddrLow; /* 168 xa8 */
-   __le32 ResponseQueueLength; /* 172 xac */
-   __le32 NetRxLargeBufferQueueOut; /* 176 xb0 */
-   __le32 NetRxLargeBufferQueueBaseAddrHi; /* 180 xb4 */
-   __le32 NetRxLargeBufferQueueBaseAddrLow; /* 184 xb8 */
-   __le32 NetRxLargeBufferQueueLength; /* 188 xbc */
-   __le32 NetRxLargeBufferLength; /* 192 xc0 */
-   __le32 NetRxSmallBufferQueueOut; /* 196 xc4 */
-   __le32 NetRxSmallBufferQueueBaseAddrHi; /* 200 xc8 */
-   __le32 NetRxSmallBufferQueueBaseAddrLow; /* 204 xcc */
-   __le32 NetRxSmallBufferQueueLength; /* 208 xd0 */
-   __le32 NetRxSmallBufferLength; /* 212 xd4 */
-   __le32 

[PATCH 4/8] qla4xxx: Resubmission: update rev num and misc cleanup

2007-05-23 Thread David C Somayajulu
Clean up and update version number

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_glbl.h|7 ++-
 drivers/scsi/qla4xxx/ql4_iocb.c|8 ++--
 drivers/scsi/qla4xxx/ql4_nvram.c   |3 +++
 drivers/scsi/qla4xxx/ql4_version.h |3 ++-
 4 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h
index 5b00cb0..a3608e0 100644
--- a/drivers/scsi/qla4xxx/ql4_glbl.h
+++ b/drivers/scsi/qla4xxx/ql4_glbl.h
@@ -8,6 +8,9 @@
 #ifndef __QLA4x_GBL_H
 #define__QLA4x_GBL_H
 
+struct iscsi_cls_conn;
+
+void qla4xxx_hw_reset(struct scsi_qla_host *ha);
 int ql4xxx_lock_drvr_wait(struct scsi_qla_host *a);
 int qla4xxx_send_tgts(struct scsi_qla_host *ha, char *ip, uint16_t port);
 int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb);
@@ -58,11 +61,13 @@ int qla4xxx_get_fw_version(struct scsi_q
 void qla4xxx_interrupt_service_routine(struct scsi_qla_host * ha,
   uint32_t intr_status);
 int qla4xxx_init_rings(struct scsi_qla_host * ha);
-struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha, uint32_t 
index);
+struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha,
+   uint32_t index);
 void qla4xxx_srb_compl(struct scsi_qla_host *ha, struct srb *srb);
 int qla4xxx_reinitialize_ddb_list(struct scsi_qla_host * ha);
 int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha,
uint32_t fw_ddb_index, uint32_t state);
+void qla4xxx_dump_buffer(void *b, uint32_t size);
 
 extern int ql4xextended_error_logging;
 extern int ql4xdiscoverywait;
diff --git a/drivers/scsi/qla4xxx/ql4_iocb.c b/drivers/scsi/qla4xxx/ql4_iocb.c
index a216a17..6e3c8c8 100644
--- a/drivers/scsi/qla4xxx/ql4_iocb.c
+++ b/drivers/scsi/qla4xxx/ql4_iocb.c
@@ -6,6 +6,10 @@
  */
 
 #include ql4_def.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
+
 
 #include scsi/scsi_tcq.h
 
@@ -243,8 +247,8 @@ int qla4xxx_send_command_to_isp(struct s
dma_addr_t  req_dma;
 
req_dma = pci_map_single(ha-pdev, cmd-request_buffer,
-cmd-request_bufflen,
-cmd-sc_data_direction);
+cmd-request_bufflen,
+cmd-sc_data_direction);
if (dma_mapping_error(req_dma))
goto queuing_error;
 
diff --git a/drivers/scsi/qla4xxx/ql4_nvram.c b/drivers/scsi/qla4xxx/ql4_nvram.c
index 58afd13..7fe0482 100644
--- a/drivers/scsi/qla4xxx/ql4_nvram.c
+++ b/drivers/scsi/qla4xxx/ql4_nvram.c
@@ -6,6 +6,9 @@
  */
 
 #include ql4_def.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
 
 static inline void eeprom_cmd(uint32_t cmd, struct scsi_qla_host *ha)
 {
diff --git a/drivers/scsi/qla4xxx/ql4_version.h 
b/drivers/scsi/qla4xxx/ql4_version.h
index e5183a6..2149069 100644
--- a/drivers/scsi/qla4xxx/ql4_version.h
+++ b/drivers/scsi/qla4xxx/ql4_version.h
@@ -5,4 +5,5 @@
  * See LICENSE.qla4xxx for copyright and licensing details.
  */
 
-#define QLA4XXX_DRIVER_VERSION 5.00.07-k1
+#define QLA4XXX_DRIVER_VERSION 5.01.00-k7
+

-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/8] qla4xxx: Resubmission: ql4_init.c bugfixes

2007-05-23 Thread David C Somayajulu
In qla4xxx_get_ddb_entry() and qla4xxx_add_device_dynamically() differentiate 
between a target which has been newly added vs a target which went offline 
temporarily and is online again.  In qla4xxx_build_ddb_list() firmware ddb 
state needs to be updated by calling qla4xxx_get_ddb_entry(). Fix 
qla4x00_pci_config() and clean up code.

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_init.c |   92 +++
 1 files changed, 63 insertions(+), 29 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c
index 6365df2..b76ba54 100644
--- a/drivers/scsi/qla4xxx/ql4_init.c
+++ b/drivers/scsi/qla4xxx/ql4_init.c
@@ -6,6 +6,9 @@
  */
 
 #include ql4_def.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
 
 static struct ddb_entry * qla4xxx_alloc_ddb(struct scsi_qla_host *ha,
uint32_t fw_ddb_index);
@@ -300,12 +303,12 @@ static int qla4xxx_init_firmware(struct 
if (!qla4xxx_fw_ready(ha))
return status;
 
-   set_bit(AF_ONLINE, ha-flags);
return qla4xxx_get_firmware_status(ha);
 }
 
 static struct ddb_entry* qla4xxx_get_ddb_entry(struct scsi_qla_host *ha,
-  uint32_t fw_ddb_index)
+   uint32_t fw_ddb_index,
+   uint32_t *new_tgt)
 {
struct dev_db_entry *fw_ddb_entry = NULL;
dma_addr_t fw_ddb_entry_dma;
@@ -313,6 +316,7 @@ static struct ddb_entry* qla4xxx_get_ddb
int found = 0;
uint32_t device_state;
 
+   *new_tgt = 0;
/* Make sure the dma buffer is valid */
fw_ddb_entry = dma_alloc_coherent(ha-pdev-dev,
  sizeof(*fw_ddb_entry),
@@ -337,7 +341,7 @@ static struct ddb_entry* qla4xxx_get_ddb
DEBUG2(printk(scsi%ld: %s: Looking for ddb[%d]\n, ha-host_no,
  __func__, fw_ddb_index));
list_for_each_entry(ddb_entry, ha-ddb_list, list) {
-   if (memcmp(ddb_entry-iscsi_name, fw_ddb_entry-iscsiName,
+   if (memcmp(ddb_entry-iscsi_name, fw_ddb_entry-iscsi_name,
   ISCSI_NAME_SIZE) == 0) {
found++;
break;
@@ -348,6 +352,7 @@ static struct ddb_entry* qla4xxx_get_ddb
DEBUG2(printk(scsi%ld: %s: ddb[%d] not found - allocating 
  new ddb\n, ha-host_no, __func__,
  fw_ddb_index));
+   *new_tgt = 1;
ddb_entry = qla4xxx_alloc_ddb(ha, fw_ddb_index);
}
 
@@ -409,26 +414,26 @@ static int qla4xxx_update_ddb_entry(stru
}
 
status = QLA_SUCCESS;
-   ddb_entry-target_session_id = le16_to_cpu(fw_ddb_entry-TSID);
+   ddb_entry-target_session_id = le16_to_cpu(fw_ddb_entry-tsid);
ddb_entry-task_mgmt_timeout =
-   le16_to_cpu(fw_ddb_entry-taskMngmntTimeout);
+   le16_to_cpu(fw_ddb_entry-def_timeout);
ddb_entry-CmdSn = 0;
-   ddb_entry-exe_throttle = le16_to_cpu(fw_ddb_entry-exeThrottle);
+   ddb_entry-exe_throttle = le16_to_cpu(fw_ddb_entry-exec_throttle);
ddb_entry-default_relogin_timeout =
-   le16_to_cpu(fw_ddb_entry-taskMngmntTimeout);
-   ddb_entry-default_time2wait = le16_to_cpu(fw_ddb_entry-minTime2Wait);
+   le16_to_cpu(fw_ddb_entry-def_timeout);
+   ddb_entry-default_time2wait = 
le16_to_cpu(fw_ddb_entry-iscsi_def_time2wait);
 
/* Update index in case it changed */
ddb_entry-fw_ddb_index = fw_ddb_index;
ha-fw_ddb_index_map[fw_ddb_index] = ddb_entry;
 
-   ddb_entry-port = le16_to_cpu(fw_ddb_entry-portNumber);
-   ddb_entry-tpgt = le32_to_cpu(fw_ddb_entry-TargetPortalGroup);
-   memcpy(ddb_entry-iscsi_name[0], fw_ddb_entry-iscsiName[0],
+   ddb_entry-port = le16_to_cpu(fw_ddb_entry-port);
+   ddb_entry-tpgt = le32_to_cpu(fw_ddb_entry-tgt_portal_grp);
+   memcpy(ddb_entry-iscsi_name[0], fw_ddb_entry-iscsi_name[0],
   min(sizeof(ddb_entry-iscsi_name),
-  sizeof(fw_ddb_entry-iscsiName)));
-   memcpy(ddb_entry-ip_addr[0], fw_ddb_entry-ipAddr[0],
-  min(sizeof(ddb_entry-ip_addr), sizeof(fw_ddb_entry-ipAddr)));
+  sizeof(fw_ddb_entry-iscsi_name)));
+   memcpy(ddb_entry-ip_addr[0], fw_ddb_entry-ip_addr[0],
+  min(sizeof(ddb_entry-ip_addr), sizeof(fw_ddb_entry-ip_addr)));
 
DEBUG2(printk(scsi%ld: %s: ddb[%d] - State= %x status= %d.\n,
  ha-host_no, __func__, fw_ddb_index,
@@ -495,6 +500,7 @@ static int qla4xxx_build_ddb_list(struct
uint32_t ddb_state;
uint32_t conn_err, err_code;
struct ddb_entry *ddb_entry;
+   uint32_t new_tgt;
 
dev_info(ha-pdev-dev, Initializing 

[PATCH 6/8] qla4xxx: Resubmission: ql4_isr.c support for new mbx cmds

2007-05-23 Thread David C Somayajulu
Add support to log all AENs and service mbx cmd completions for QLA4032

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_isr.c |   53 ++--
 1 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
index 35b9e36..946e22b 100644
--- a/drivers/scsi/qla4xxx/ql4_isr.c
+++ b/drivers/scsi/qla4xxx/ql4_isr.c
@@ -6,6 +6,9 @@
  */
 
 #include ql4_def.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
 
 /**
  * qla2x00_process_completed_request() - Process a Fast Post response.
@@ -417,6 +420,7 @@ static void qla4xxx_isr_decode_mailbox(s
   uint32_t mbox_status)
 {
int i;
+   uint32_t mbox_stat2, mbox_stat3;
 
if ((mbox_status == MBOX_STS_BUSY) ||
(mbox_status == MBOX_STS_INTERMEDIATE_COMPLETION) ||
@@ -437,6 +441,12 @@ static void qla4xxx_isr_decode_mailbox(s
} else if (mbox_status  12 == MBOX_ASYNC_EVENT_STATUS) {
/* Immediately process the AENs that don't require much work.
 * Only queue the database_changed AENs */
+   if (ha-aen_log.count  MAX_AEN_ENTRIES) {
+   for (i = 0; i  MBOX_AEN_REG_COUNT; i++)
+   
ha-aen_log.entry[ha-aen_log.count].mbox_sts[i] =
+   readl(ha-reg-mailbox[i]);
+   ha-aen_log.count++;
+   }
switch (mbox_status) {
case MBOX_ASTS_SYSTEM_ERROR:
/* Log Mailbox registers */
@@ -493,6 +503,16 @@ static void qla4xxx_isr_decode_mailbox(s
  mbox_status));
break;
 
+   case MBOX_ASTS_IP_ADDR_STATE_CHANGED:
+   mbox_stat2 = readl(ha-reg-mailbox[2]);
+   mbox_stat3 = readl(ha-reg-mailbox[3]);
+
+   if ((mbox_stat3 == 5)  (mbox_stat2 == 3))
+   set_bit(DPC_GET_DHCP_IP_ADDR, ha-dpc_flags);
+   else if ((mbox_stat3 == 2)  (mbox_stat2 == 5))
+   set_bit(DPC_RESET_HA, ha-dpc_flags);
+   break;
+
case MBOX_ASTS_MAC_ADDRESS_CHANGED:
case MBOX_ASTS_DNS:
/* No action */
@@ -518,11 +538,6 @@ static void qla4xxx_isr_decode_mailbox(s
/* Queue AEN information and process it in the DPC
 * routine */
if (ha-aen_q_count  0) {
-   /* advance pointer */
-   if (ha-aen_in == (MAX_AEN_ENTRIES - 1))
-   ha-aen_in = 0;
-   else
-   ha-aen_in++;
 
/* decrement available counter */
ha-aen_q_count--;
@@ -542,6 +557,10 @@ static void qla4xxx_isr_decode_mailbox(s
  ha-aen_q[ha-aen_in].mbox_sts[2],
  ha-aen_q[ha-aen_in].mbox_sts[3],
  ha-aen_q[ha-aen_in].  
mbox_sts[4]));
+   /* advance pointer */
+   ha-aen_in++;
+   if (ha-aen_in == MAX_AEN_ENTRIES)
+   ha-aen_in = 0;
 
/* The DPC routine will process the aen */
set_bit(DPC_AEN, ha-dpc_flags);
@@ -724,25 +743,24 @@ void qla4xxx_process_aen(struct scsi_qla
 
spin_lock_irqsave(ha-hardware_lock, flags);
while (ha-aen_out != ha-aen_in) {
-   /* Advance pointers for next entry */
-   if (ha-aen_out == (MAX_AEN_ENTRIES - 1))
-   ha-aen_out = 0;
-   else
-   ha-aen_out++;
-
-   ha-aen_q_count++;
aen = ha-aen_q[ha-aen_out];
-
/* copy aen information to local structure */
for (i = 0; i  MBOX_AEN_REG_COUNT; i++)
mbox_sts[i] = aen-mbox_sts[i];
 
+   ha-aen_q_count++;
+   ha-aen_out++;
+
+   if (ha-aen_out == MAX_AEN_ENTRIES)
+   ha-aen_out = 0;
+
spin_unlock_irqrestore(ha-hardware_lock, flags);
 
-   DEBUG(printk(scsi%ld: AEN[%d] %04x, index [%d] state=%04x 
-mod=%x conerr=%08x \n, ha-host_no, ha-aen_out,
-mbox_sts[0], mbox_sts[2], mbox_sts[3],
-mbox_sts[1], mbox_sts[4]));
+   DEBUG2(printk(qla4xxx(%ld): AEN[%d]=0x%08x, mbx1=0x%08x 
mbx2=0x%08x
+mbx3=0x%08x 

[PATCH 7/8] qla4xxx: Resubmission: ql4_mbx.c remove dead code bugfixes

2007-05-23 Thread David C Somayajulu
All all inbound mbx registers for all mbx commands. Remove dead code.

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_mbx.c |  274 +++-
 1 files changed, 103 insertions(+), 171 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c
index f116ff9..35cd73c 100644
--- a/drivers/scsi/qla4xxx/ql4_mbx.c
+++ b/drivers/scsi/qla4xxx/ql4_mbx.c
@@ -6,6 +6,9 @@
  */
 
 #include ql4_def.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
 
 
 /**
@@ -169,84 +172,6 @@ mbox_exit:
return status;
 }
 
-
-#if 0
-
-/**
- * qla4xxx_issue_iocb - issue mailbox iocb command
- * @ha: adapter state pointer.
- * @buffer: buffer pointer.
- * @phys_addr: physical address of buffer.
- * @size: size of buffer.
- *
- * Issues iocbs via mailbox commands.
- * TARGET_QUEUE_LOCK must be released.
- * ADAPTER_STATE_LOCK must be released.
- **/
-int
-qla4xxx_issue_iocb(struct scsi_qla_host * ha, void *buffer,
-  dma_addr_t phys_addr, size_t size)
-{
-   uint32_t mbox_cmd[MBOX_REG_COUNT];
-   uint32_t mbox_sts[MBOX_REG_COUNT];
-   int status;
-
-   memset(mbox_cmd, 0, sizeof(mbox_cmd));
-   memset(mbox_sts, 0, sizeof(mbox_sts));
-   mbox_cmd[0] = MBOX_CMD_EXECUTE_IOCB_A64;
-   mbox_cmd[1] = 0;
-   mbox_cmd[2] = LSDW(phys_addr);
-   mbox_cmd[3] = MSDW(phys_addr);
-   status = qla4xxx_mailbox_command(ha, 4, 1, mbox_cmd[0], mbox_sts[0]);
-   return status;
-}
-
-int qla4xxx_conn_close_sess_logout(struct scsi_qla_host * ha,
-  uint16_t fw_ddb_index,
-  uint16_t connection_id,
-  uint16_t option)
-{
-   uint32_t mbox_cmd[MBOX_REG_COUNT];
-   uint32_t mbox_sts[MBOX_REG_COUNT];
-
-   memset(mbox_cmd, 0, sizeof(mbox_cmd));
-   memset(mbox_sts, 0, sizeof(mbox_sts));
-   mbox_cmd[0] = MBOX_CMD_CONN_CLOSE_SESS_LOGOUT;
-   mbox_cmd[1] = fw_ddb_index;
-   mbox_cmd[2] = connection_id;
-   mbox_cmd[3] = LOGOUT_OPTION_RELOGIN;
-   if (qla4xxx_mailbox_command(ha, 4, 2, mbox_cmd[0], mbox_sts[0]) !=
-   QLA_SUCCESS) {
-   DEBUG2(printk(scsi%ld: %s: MBOX_CMD_CONN_CLOSE_SESS_LOGOUT 
- option %04x failed sts %04X %04X,
- ha-host_no, __func__,
- option, mbox_sts[0], mbox_sts[1]));
-   if (mbox_sts[0] == 0x4005)
-   DEBUG2(printk(%s reason %04X\n, __func__,
- mbox_sts[1]));
-   }
-   return QLA_SUCCESS;
-}
-
-int qla4xxx_clear_database_entry(struct scsi_qla_host * ha,
-uint16_t fw_ddb_index)
-{
-   uint32_t mbox_cmd[MBOX_REG_COUNT];
-   uint32_t mbox_sts[MBOX_REG_COUNT];
-
-   memset(mbox_cmd, 0, sizeof(mbox_cmd));
-   memset(mbox_sts, 0, sizeof(mbox_sts));
-   mbox_cmd[0] = MBOX_CMD_CLEAR_DATABASE_ENTRY;
-   mbox_cmd[1] = fw_ddb_index;
-   if (qla4xxx_mailbox_command(ha, 2, 5, mbox_cmd[0], mbox_sts[0]) !=
-   QLA_SUCCESS)
-   return QLA_ERROR;
-
-   return QLA_SUCCESS;
-}
-
-#endif  /*  0  */
-
 /**
  * qla4xxx_initialize_fw_cb - initializes firmware control block.
  * @ha: Pointer to host adapter structure.
@@ -272,10 +197,13 @@ int qla4xxx_initialize_fw_cb(struct scsi
/* Get Initialize Firmware Control Block. */
memset(mbox_cmd, 0, sizeof(mbox_cmd));
memset(mbox_sts, 0, sizeof(mbox_sts));
+
mbox_cmd[0] = MBOX_CMD_GET_INIT_FW_CTRL_BLOCK;
mbox_cmd[2] = LSDW(init_fw_cb_dma);
mbox_cmd[3] = MSDW(init_fw_cb_dma);
-   if (qla4xxx_mailbox_command(ha, 4, 1, mbox_cmd[0], mbox_sts[0]) !=
+   mbox_cmd[4] = sizeof(struct init_fw_ctrl_blk);
+
+   if (qla4xxx_mailbox_command(ha, MBOX_REG_COUNT, 1, mbox_cmd[0], 
mbox_sts[0]) !=
QLA_SUCCESS) {
dma_free_coherent(ha-pdev-dev,
  sizeof(struct init_fw_ctrl_blk),
@@ -287,51 +215,56 @@ int qla4xxx_initialize_fw_cb(struct scsi
qla4xxx_init_rings(ha);
 
/* Fill in the request and response queue information. */
-   init_fw_cb-ReqQConsumerIndex = cpu_to_le16(ha-request_out);
-   init_fw_cb-ComplQProducerIndex = cpu_to_le16(ha-response_in);
-   init_fw_cb-ReqQLen = __constant_cpu_to_le16(REQUEST_QUEUE_DEPTH);
-   init_fw_cb-ComplQLen = __constant_cpu_to_le16(RESPONSE_QUEUE_DEPTH);
-   init_fw_cb-ReqQAddrLo = cpu_to_le32(LSDW(ha-request_dma));
-   init_fw_cb-ReqQAddrHi = cpu_to_le32(MSDW(ha-request_dma));
-   init_fw_cb-ComplQAddrLo = cpu_to_le32(LSDW(ha-response_dma));
-   init_fw_cb-ComplQAddrHi = cpu_to_le32(MSDW(ha-response_dma));
-   init_fw_cb-ShadowRegBufAddrLo =
+   init_fw_cb-pri.rqq_consumer_idx = cpu_to_le16(ha-request_out);
+   

[PATCH 8/8] qla4xxx: Resubmission: ql4_os.c bugfixes

2007-05-23 Thread David C Somayajulu
Free memory resources after invoking free_irq() in qla4xxx_free_adapter(). 
QLA4xxx has two pci functions per port (Ethernet and iSCSI). When one of these 
PCI functions issues a HBA reset, all other functions are notified and need to 
acknowledge and re-initialize. During module qla4xxx_remove_adapter() gets 
invoked. This function needs to wait if it is currently responding to a reset 
from another function.

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_os.c |   17 +
 1 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index da21f5f..0e4688c 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -10,6 +10,10 @@ #include scsi/scsi_tcq.h
 #include scsi/scsicam.h
 
 #include ql4_def.h
+#include ql4_version.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
 
 /*
  * Driver version
@@ -711,7 +715,7 @@ static int qla4xxx_cmd_wait(struct scsi_
return stat;
 }
 
-static void qla4xxx_hw_reset(struct scsi_qla_host *ha)
+void qla4xxx_hw_reset(struct scsi_qla_host *ha)
 {
uint32_t ctrl_status;
unsigned long flags = 0;
@@ -1081,13 +1085,13 @@ static void qla4xxx_free_adapter(struct 
if (ha-timer_active)
qla4xxx_stop_timer(ha);
 
-   /* free extra memory */
-   qla4xxx_mem_free(ha);
-
/* Detach interrupts */
if (test_and_clear_bit(AF_IRQ_ATTACHED, ha-flags))
free_irq(ha-pdev-irq, ha);
 
+   /* free extra memory */
+   qla4xxx_mem_free(ha);
+
pci_disable_device(ha-pdev);
 
 }
@@ -1332,6 +1336,11 @@ static void __devexit qla4xxx_remove_ada
 
ha = pci_get_drvdata(pdev);
 
+   qla4xxx_disable_intrs(ha);
+
+   while (test_bit(DPC_RESET_HA_INTR, ha-dpc_flags))
+   ssleep(1);
+
/* remove devs from iscsi_sessions to scsi_devices */
qla4xxx_free_ddb_list(ha);
 

-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/8] qla4xxx: Resubmission: update rev num and misc cleanup

2007-05-23 Thread David C Somayajulu
On Wed, 2007-05-23 at 17:54 -0700, David C Somayajulu wrote:
Sorry I hit send before changing the subject header completely. Please 
disregard this one. I will resend this patch with the proper subject line.
-david S.

 Clean up and update version number
 
 Signed-off-by: David Somayajulu [EMAIL PROTECTED]
 Signed-off-by: Mike Christie [EMAIL PROTECTED]
 
  drivers/scsi/qla4xxx/ql4_glbl.h|7 ++-
  drivers/scsi/qla4xxx/ql4_iocb.c|8 ++--
  drivers/scsi/qla4xxx/ql4_nvram.c   |3 +++
  drivers/scsi/qla4xxx/ql4_version.h |3 ++-
  4 files changed, 17 insertions(+), 4 deletions(-)
 
 diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h
 index 5b00cb0..a3608e0 100644
 --- a/drivers/scsi/qla4xxx/ql4_glbl.h
 +++ b/drivers/scsi/qla4xxx/ql4_glbl.h
 @@ -8,6 +8,9 @@
  #ifndef __QLA4x_GBL_H
  #define  __QLA4x_GBL_H
  
 +struct iscsi_cls_conn;
 +
 +void qla4xxx_hw_reset(struct scsi_qla_host *ha);
  int ql4xxx_lock_drvr_wait(struct scsi_qla_host *a);
  int qla4xxx_send_tgts(struct scsi_qla_host *ha, char *ip, uint16_t port);
  int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb);
 @@ -58,11 +61,13 @@ int qla4xxx_get_fw_version(struct scsi_q
  void qla4xxx_interrupt_service_routine(struct scsi_qla_host * ha,
  uint32_t intr_status);
  int qla4xxx_init_rings(struct scsi_qla_host * ha);
 -struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha, 
 uint32_t index);
 +struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha,
 + uint32_t index);
  void qla4xxx_srb_compl(struct scsi_qla_host *ha, struct srb *srb);
  int qla4xxx_reinitialize_ddb_list(struct scsi_qla_host * ha);
  int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha,
   uint32_t fw_ddb_index, uint32_t state);
 +void qla4xxx_dump_buffer(void *b, uint32_t size);
  
  extern int ql4xextended_error_logging;
  extern int ql4xdiscoverywait;
 diff --git a/drivers/scsi/qla4xxx/ql4_iocb.c b/drivers/scsi/qla4xxx/ql4_iocb.c
 index a216a17..6e3c8c8 100644
 --- a/drivers/scsi/qla4xxx/ql4_iocb.c
 +++ b/drivers/scsi/qla4xxx/ql4_iocb.c
 @@ -6,6 +6,10 @@
   */
  
  #include ql4_def.h
 +#include ql4_glbl.h
 +#include ql4_dbg.h
 +#include ql4_inline.h
 +
  
  #include scsi/scsi_tcq.h
  
 @@ -243,8 +247,8 @@ int qla4xxx_send_command_to_isp(struct s
   dma_addr_t  req_dma;
  
   req_dma = pci_map_single(ha-pdev, cmd-request_buffer,
 -  cmd-request_bufflen,
 -  cmd-sc_data_direction);
 +  cmd-request_bufflen,
 +  cmd-sc_data_direction);
   if (dma_mapping_error(req_dma))
   goto queuing_error;
  
 diff --git a/drivers/scsi/qla4xxx/ql4_nvram.c 
 b/drivers/scsi/qla4xxx/ql4_nvram.c
 index 58afd13..7fe0482 100644
 --- a/drivers/scsi/qla4xxx/ql4_nvram.c
 +++ b/drivers/scsi/qla4xxx/ql4_nvram.c
 @@ -6,6 +6,9 @@
   */
  
  #include ql4_def.h
 +#include ql4_glbl.h
 +#include ql4_dbg.h
 +#include ql4_inline.h
  
  static inline void eeprom_cmd(uint32_t cmd, struct scsi_qla_host *ha)
  {
 diff --git a/drivers/scsi/qla4xxx/ql4_version.h 
 b/drivers/scsi/qla4xxx/ql4_version.h
 index e5183a6..2149069 100644
 --- a/drivers/scsi/qla4xxx/ql4_version.h
 +++ b/drivers/scsi/qla4xxx/ql4_version.h
 @@ -5,4 +5,5 @@
   * See LICENSE.qla4xxx for copyright and licensing details.
   */
  
 -#define QLA4XXX_DRIVER_VERSION   5.00.07-k1
 +#define QLA4XXX_DRIVER_VERSION   5.01.00-k7
 +
 
-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 5/8] qla4xxx: Resubmission: update rev num and misc cleanup

2007-05-23 Thread David C Somayajulu
Clean up and update version number

Signed-off-by: David Somayajulu [EMAIL PROTECTED]
Signed-off-by: Mike Christie [EMAIL PROTECTED]

 drivers/scsi/qla4xxx/ql4_glbl.h|7 ++-
 drivers/scsi/qla4xxx/ql4_iocb.c|8 ++--
 drivers/scsi/qla4xxx/ql4_nvram.c   |3 +++
 drivers/scsi/qla4xxx/ql4_version.h |3 ++-
 4 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h
index 5b00cb0..a3608e0 100644
--- a/drivers/scsi/qla4xxx/ql4_glbl.h
+++ b/drivers/scsi/qla4xxx/ql4_glbl.h
@@ -8,6 +8,9 @@
 #ifndef __QLA4x_GBL_H
 #define__QLA4x_GBL_H
 
+struct iscsi_cls_conn;
+
+void qla4xxx_hw_reset(struct scsi_qla_host *ha);
 int ql4xxx_lock_drvr_wait(struct scsi_qla_host *a);
 int qla4xxx_send_tgts(struct scsi_qla_host *ha, char *ip, uint16_t port);
 int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb);
@@ -58,11 +61,13 @@ int qla4xxx_get_fw_version(struct scsi_q
 void qla4xxx_interrupt_service_routine(struct scsi_qla_host * ha,
   uint32_t intr_status);
 int qla4xxx_init_rings(struct scsi_qla_host * ha);
-struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha, uint32_t 
index);
+struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha,
+   uint32_t index);
 void qla4xxx_srb_compl(struct scsi_qla_host *ha, struct srb *srb);
 int qla4xxx_reinitialize_ddb_list(struct scsi_qla_host * ha);
 int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha,
uint32_t fw_ddb_index, uint32_t state);
+void qla4xxx_dump_buffer(void *b, uint32_t size);
 
 extern int ql4xextended_error_logging;
 extern int ql4xdiscoverywait;
diff --git a/drivers/scsi/qla4xxx/ql4_iocb.c b/drivers/scsi/qla4xxx/ql4_iocb.c
index a216a17..6e3c8c8 100644
--- a/drivers/scsi/qla4xxx/ql4_iocb.c
+++ b/drivers/scsi/qla4xxx/ql4_iocb.c
@@ -6,6 +6,10 @@
  */
 
 #include ql4_def.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
+
 
 #include scsi/scsi_tcq.h
 
@@ -243,8 +247,8 @@ int qla4xxx_send_command_to_isp(struct s
dma_addr_t  req_dma;
 
req_dma = pci_map_single(ha-pdev, cmd-request_buffer,
-cmd-request_bufflen,
-cmd-sc_data_direction);
+cmd-request_bufflen,
+cmd-sc_data_direction);
if (dma_mapping_error(req_dma))
goto queuing_error;
 
diff --git a/drivers/scsi/qla4xxx/ql4_nvram.c b/drivers/scsi/qla4xxx/ql4_nvram.c
index 58afd13..7fe0482 100644
--- a/drivers/scsi/qla4xxx/ql4_nvram.c
+++ b/drivers/scsi/qla4xxx/ql4_nvram.c
@@ -6,6 +6,9 @@
  */
 
 #include ql4_def.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
 
 static inline void eeprom_cmd(uint32_t cmd, struct scsi_qla_host *ha)
 {
diff --git a/drivers/scsi/qla4xxx/ql4_version.h 
b/drivers/scsi/qla4xxx/ql4_version.h
index e5183a6..2149069 100644
--- a/drivers/scsi/qla4xxx/ql4_version.h
+++ b/drivers/scsi/qla4xxx/ql4_version.h
@@ -5,4 +5,5 @@
  * See LICENSE.qla4xxx for copyright and licensing details.
  */
 
-#define QLA4XXX_DRIVER_VERSION 5.00.07-k1
+#define QLA4XXX_DRIVER_VERSION 5.01.00-k7
+

-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC] [PATCH 0/5] qla4xxx: Add IPv6 support and misc

2007-05-02 Thread David C Somayajulu
The following set of patches 
1. add support for ipv6 for qla4032 
2. provide bug fixes
3. misc. support 

Patch 1/5  
has changes to the driver and firmware related structures to
1. clean up and make the firmware related structures look linux like.
2. add fields/structures for ipv6 support
3. add support for capaturing all AEN types in a ring buffer, to aid 
troubleshooting.
4. abstract the functions for sending commands to the HBA (i.e., 
sending via Request Queue or Mailbox registers) so that the underlying 
functions can be different in future hardware. Also mailbox commands which are 
not performance critical may be sent via Request Queues (using mailbox iocbs).

Patch 2/5 
has the following changes for initialization routines.
1. fix qla4x00_pci_config()
2. fix in qla4xxx_add_device_dynamically(), so that a new target coming 
online and existing targets which went offline and then came back online are 
differentiated.
3. In qla4xxx_build_ddb_list() the firmware ddb entry's state needs to 
be updated by calling qla4xxx_get_fwddb_entry() after qla4xxx_set_ddb_entry().

Patch 3/5 
adds support code for handling new AENs specific to qla4032.

Patch 4/5 
cleans up the mailbox code and adds functionality to support qla4032.

Patch 5/5 
1. Since qla4xxx is a multifunction device having one iSCSI and one 
Ethernet function per physical port, when one of the functions resets the HBA 
all others need to acknowledge it and wait till the reset is complete and each 
of them need to re-initialize. A bug in qla4xxx_free_adapter() was resulting in 
where the resources pertaining to a function were getting released due to 
module unload, when the function was recovering from reset issued by one of the 
other functions.
2. In qla4xxx_free_adapter() memory resources needed to be freed after 
free_irq() is invoked.
3. add support for passthru commands to HBA.

Thanks
David Somayajulu
Qlogic Corporation
-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC] [PATCH 1/5] qla4xxx: Add IPv6 support and misc

2007-05-02 Thread David C Somayajulu

Signed-off-by: David Somayajulu [EMAIL PROTECTED]

---
 drivers/scsi/qla4xxx/ql4_def.h |   84 ---
 drivers/scsi/qla4xxx/ql4_fw.h  |  426 +++-

diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
index 6f4cf2d..7bbc2ab 100644
--- a/drivers/scsi/qla4xxx/ql4_def.h
+++ b/drivers/scsi/qla4xxx/ql4_def.h
@@ -122,8 +122,7 @@ #define MAX_REQS_SERVICED_PER_INTR  16
 
 #define ISCSI_IPADDR_SIZE  4   /* IP address size */
 #define ISCSI_ALIAS_SIZE   32  /* ISCSI Alais name size */
-#define ISCSI_NAME_SIZE255 /* ISCSI Name size -
-* usually a string */
+#define ISCSI_NAME_SIZE0xE0/* ISCSI Name size */
 
 #define LSDW(x) ((u32)((u64)(x)))
 #define MSDW(x) ((u32)u64)(x))  16)  16))
@@ -159,6 +158,7 @@ struct srb {
struct ddb_entry*ddb;
uint16_t flags; /* (1) Status flags. */
 
+#define SRB_SCSI_PASSTHRU  BIT_2   /* for scsi passthru cmds */
 #define SRB_DMA_VALID  BIT_3   /* DMA Buffer mapped. */
 #define SRB_GOT_SENSE  BIT_4   /* sense data recieved. */
uint8_t state;  /* (1) Status flags. */
@@ -187,9 +187,21 @@ #define SRB_ERR_OTHER 4
u_long u_start; /* Time when we handed the cmd to F/W */
 };
 
-   /*
-* Device Database (DDB) structure
-*/
+/*
+ * Asynchronous Event Queue structure
+ */
+struct aen {
+uint32_t mbox_sts[MBOX_AEN_REG_COUNT];
+};
+
+struct ql4_aen_log {
+int count;
+struct aen entry[MAX_AEN_ENTRIES];
+};
+
+/*
+ * Device Database (DDB) structure
+ */
 struct ddb_entry {
struct list_head list;  /* ddb list */
struct scsi_qla_host *ha;
@@ -254,13 +266,6 @@ #define DF_NO_RELOGIN  1   /* Do not relog
 #define DF_ISNS_DISCOVERED 2   /* Device was discovered via iSNS */
 #define DF_FO_MASKED   3
 
-/*
- * Asynchronous Event Queue structure
- */
-struct aen {
-   uint32_t mbox_sts[MBOX_AEN_REG_COUNT];
-};
-
 
 #include ql4_fw.h
 #include ql4_nvram.h
@@ -270,31 +275,36 @@ #include ql4_nvram.h
  */
 struct scsi_qla_host {
/* Linux adapter configuration data */
-   struct Scsi_Host *host; /* pointer to host data */
-   uint32_t tot_ddbs;
unsigned long flags;
 
-#define AF_ONLINE0 /* 0x0001 */
-#define AF_INIT_DONE 1 /* 0x0002 */
-#define AF_MBOX_COMMAND  2 /* 0x0004 */
-#define AF_MBOX_COMMAND_DONE 3 /* 0x0008 */
-#define AF_INTERRUPTS_ON 6 /* 0x0040 Not Used */
-#define AF_GET_CRASH_RECORD  7 /* 0x0080 */
-#define AF_LINK_UP   8 /* 0x0100 */
-#define AF_IRQ_ATTACHED 10 /* 0x0400 */
-#define AF_ISNS_CMD_IN_PROCESS  12 /* 0x1000 */
-#define AF_ISNS_CMD_DONE13 /* 0x2000 */
+#define AF_ONLINE  0 /* 0x0001 */
+#define AF_INIT_DONE   1 /* 0x0002 */
+#define AF_MBOX_COMMAND2 /* 0x0004 */
+#define AF_MBOX_COMMAND_DONE   3 /* 0x0008 */
+#define AF_INTERRUPTS_ON   6 /* 0x0040 */
+#define AF_GET_CRASH_RECORD7 /* 0x0080 */
+#define AF_LINK_UP 8 /* 0x0100 */
+#define AF_IRQ_ATTACHED10 /* 0x0400 */
+#define AF_DISABLE_ACB_COMPLETE11 /* 0x0800 */
 
unsigned long dpc_flags;
 
-#define DPC_RESET_HA 1 /* 0x0002 */
-#define DPC_RETRY_RESET_HA   2 /* 0x0004 */
-#define DPC_RELOGIN_DEVICE   3 /* 0x0008 */
-#define DPC_RESET_HA_DESTROY_DDB_LIST 4 /* 0x0010 */
-#define DPC_RESET_HA_INTR5 /* 0x0020 */
-#define DPC_ISNS_RESTART 7 /* 0x0080 */
-#define DPC_AEN  9 /* 0x0200 */
-#define DPC_GET_DHCP_IP_ADDR15 /* 0x8000 */
+#define DPC_RESET_HA   1 /* 0x0002 */
+#define DPC_RETRY_RESET_HA 2 /* 0x0004 */
+#define DPC_RELOGIN_DEVICE 3 /* 0x0008 */
+#define DPC_RESET_HA_DESTROY_DDB_LIST  4 /* 0x0010 */
+#define DPC_RESET_HA_INTR  5 /* 0x0020 */
+#define DPC_ISNS_RESTART   7 /* 0x0080 */
+#define DPC_AEN9 /* 0x0200 */
+#define DPC_GET_DHCP_IP_ADDR   15 /* 0x8000 */
+
+   int (*ql4cmd)(struct scsi_qla_host *ha, struct srb * srb);
+   int (*ql4mbx)(struct scsi_qla_host *ha, uint8_t inCount,
+   uint8_t outCount, uint32_t *mbx_cmd,
+   uint32_t *mbx_sts);
+
+   struct Scsi_Host *host; /* pointer to host data */
+   uint32_t tot_ddbs;
 
uint16_tiocb_cnt;
uint16_tiocb_hiwat;
@@ -344,6 +354,7 @@ #define MIN_IOBASE_LEN

[RFC] [PATCH 3/5] qla4xxx: Add IPv6 support and misc

2007-05-02 Thread David C Somayajulu
Signed-off-by: David Somayajulu [EMAIL PROTECTED]

---
 drivers/scsi/qla4xxx/ql4_isr.c |   54 +++--

diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
index 35b9e36..8c338ee 100644
--- a/drivers/scsi/qla4xxx/ql4_isr.c
+++ b/drivers/scsi/qla4xxx/ql4_isr.c
@@ -6,6 +6,10 @@
  */
 
 #include ql4_def.h
+#include ql4_version.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
 
 /**
  * qla2x00_process_completed_request() - Process a Fast Post response.
@@ -417,6 +421,7 @@ static void qla4xxx_isr_decode_mailbox(s
   uint32_t mbox_status)
 {
int i;
+   uint32_t mbox_stat2, mbox_stat3;
 
if ((mbox_status == MBOX_STS_BUSY) ||
(mbox_status == MBOX_STS_INTERMEDIATE_COMPLETION) ||
@@ -437,6 +442,12 @@ static void qla4xxx_isr_decode_mailbox(s
} else if (mbox_status  12 == MBOX_ASYNC_EVENT_STATUS) {
/* Immediately process the AENs that don't require much work.
 * Only queue the database_changed AENs */
+   if (ha-aen_log.count  MAX_AEN_ENTRIES) {
+   for (i = 0; i  MBOX_AEN_REG_COUNT; i++)
+   
ha-aen_log.entry[ha-aen_log.count].mbox_sts[i] =
+   readl(ha-reg-mailbox[i]);
+   ha-aen_log.count++;
+   }
switch (mbox_status) {
case MBOX_ASTS_SYSTEM_ERROR:
/* Log Mailbox registers */
@@ -493,6 +504,16 @@ static void qla4xxx_isr_decode_mailbox(s
  mbox_status));
break;
 
+   case MBOX_ASTS_IP_ADDR_STATE_CHANGED:
+   mbox_stat2 = readl(ha-reg-mailbox[2]);
+   mbox_stat3 = readl(ha-reg-mailbox[3]);
+
+   if ((mbox_stat3 == 5)  (mbox_stat2 == 3))
+   set_bit(DPC_GET_DHCP_IP_ADDR, ha-dpc_flags);
+   else if ((mbox_stat3 == 2)  (mbox_stat2 == 5))
+   set_bit(DPC_RESET_HA, ha-dpc_flags);
+   break;
+
case MBOX_ASTS_MAC_ADDRESS_CHANGED:
case MBOX_ASTS_DNS:
/* No action */
@@ -518,11 +539,6 @@ static void qla4xxx_isr_decode_mailbox(s
/* Queue AEN information and process it in the DPC
 * routine */
if (ha-aen_q_count  0) {
-   /* advance pointer */
-   if (ha-aen_in == (MAX_AEN_ENTRIES - 1))
-   ha-aen_in = 0;
-   else
-   ha-aen_in++;
 
/* decrement available counter */
ha-aen_q_count--;
@@ -542,6 +558,10 @@ static void qla4xxx_isr_decode_mailbox(s
  ha-aen_q[ha-aen_in].mbox_sts[2],
  ha-aen_q[ha-aen_in].mbox_sts[3],
  ha-aen_q[ha-aen_in].  
mbox_sts[4]));
+   /* advance pointer */
+   ha-aen_in++;
+   if (ha-aen_in == MAX_AEN_ENTRIES)
+   ha-aen_in = 0;
 
/* The DPC routine will process the aen */
set_bit(DPC_AEN, ha-dpc_flags);
@@ -724,25 +744,24 @@ void qla4xxx_process_aen(struct scsi_qla
 
spin_lock_irqsave(ha-hardware_lock, flags);
while (ha-aen_out != ha-aen_in) {
-   /* Advance pointers for next entry */
-   if (ha-aen_out == (MAX_AEN_ENTRIES - 1))
-   ha-aen_out = 0;
-   else
-   ha-aen_out++;
-
-   ha-aen_q_count++;
aen = ha-aen_q[ha-aen_out];
-
/* copy aen information to local structure */
for (i = 0; i  MBOX_AEN_REG_COUNT; i++)
mbox_sts[i] = aen-mbox_sts[i];
 
+   ha-aen_q_count++;
+   ha-aen_out++;
+
+   if (ha-aen_out == MAX_AEN_ENTRIES)
+   ha-aen_out = 0;
+
spin_unlock_irqrestore(ha-hardware_lock, flags);
 
-   DEBUG(printk(scsi%ld: AEN[%d] %04x, index [%d] state=%04x 
-mod=%x conerr=%08x \n, ha-host_no, ha-aen_out,
-mbox_sts[0], mbox_sts[2], mbox_sts[3],
-mbox_sts[1], mbox_sts[4]));
+   DEBUG2(printk(qla4xxx(%ld): AEN[%d]=0x%08x, mbx1=0x%08x 
mbx2=0x%08x
+mbx3=0x%08x mbx4=0x%08x\n, ha-host_no,
+   (ha-aen_out ? (ha-aen_out-1): (MAX_AEN_ENTRIES-1)),
+   mbox_sts[0], mbox_sts[1], mbox_sts[2],
+

[RFC] [PATCH 4/5] qla4xxx: Add IPv6 support and misc

2007-05-02 Thread David C Somayajulu
Signed-off-by: David Somayajulu [EMAIL PROTECTED]

---
 drivers/scsi/qla4xxx/ql4_mbx.c |  190 ++--

diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c
index 7f28657..0ef777a 100644
--- a/drivers/scsi/qla4xxx/ql4_mbx.c
+++ b/drivers/scsi/qla4xxx/ql4_mbx.c
@@ -6,6 +6,10 @@
  */
 
 #include ql4_def.h
+#include ql4_version.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
 
 
 /**
@@ -191,11 +195,13 @@ qla4xxx_issue_iocb(struct scsi_qla_host 
 
memset(mbox_cmd, 0, sizeof(mbox_cmd));
memset(mbox_sts, 0, sizeof(mbox_sts));
+
mbox_cmd[0] = MBOX_CMD_EXECUTE_IOCB_A64;
mbox_cmd[1] = 0;
mbox_cmd[2] = LSDW(phys_addr);
mbox_cmd[3] = MSDW(phys_addr);
-   status = qla4xxx_mailbox_command(ha, 4, 1, mbox_cmd[0], mbox_sts[0]);
+
+   status = qla4xxx_mailbox_command(ha, MBOX_REG_COUNT, 1, mbox_cmd[0], 
mbox_sts[0]);
return status;
 }
 
@@ -209,11 +215,13 @@ int qla4xxx_conn_close_sess_logout(struc
 
memset(mbox_cmd, 0, sizeof(mbox_cmd));
memset(mbox_sts, 0, sizeof(mbox_sts));
+
mbox_cmd[0] = MBOX_CMD_CONN_CLOSE_SESS_LOGOUT;
mbox_cmd[1] = fw_ddb_index;
mbox_cmd[2] = connection_id;
mbox_cmd[3] = LOGOUT_OPTION_RELOGIN;
-   if (qla4xxx_mailbox_command(ha, 4, 2, mbox_cmd[0], mbox_sts[0]) !=
+
+   if (qla4xxx_mailbox_command(ha, MBOX_REG_COUNT, 2, mbox_cmd[0], 
mbox_sts[0]) !=
QLA_SUCCESS) {
DEBUG2(printk(scsi%ld: %s: MBOX_CMD_CONN_CLOSE_SESS_LOGOUT 
  option %04x failed sts %04X %04X,
@@ -234,9 +242,11 @@ int qla4xxx_clear_database_entry(struct 
 
memset(mbox_cmd, 0, sizeof(mbox_cmd));
memset(mbox_sts, 0, sizeof(mbox_sts));
+
mbox_cmd[0] = MBOX_CMD_CLEAR_DATABASE_ENTRY;
mbox_cmd[1] = fw_ddb_index;
-   if (qla4xxx_mailbox_command(ha, 2, 5, mbox_cmd[0], mbox_sts[0]) !=
+
+   if (qla4xxx_mailbox_command(ha, MBOX_REG_COUNT, 5, mbox_cmd[0], 
mbox_sts[0]) !=
QLA_SUCCESS)
return QLA_ERROR;
 
@@ -268,10 +278,13 @@ int qla4xxx_initialize_fw_cb(struct scsi
/* Get Initialize Firmware Control Block. */
memset(mbox_cmd, 0, sizeof(mbox_cmd));
memset(mbox_sts, 0, sizeof(mbox_sts));
+
mbox_cmd[0] = MBOX_CMD_GET_INIT_FW_CTRL_BLOCK;
mbox_cmd[2] = LSDW(init_fw_cb_dma);
mbox_cmd[3] = MSDW(init_fw_cb_dma);
-   if (qla4xxx_mailbox_command(ha, 4, 1, mbox_cmd[0], mbox_sts[0]) !=
+   mbox_cmd[4] = sizeof(struct init_fw_ctrl_blk);
+
+   if (qla4xxx_mailbox_command(ha, MBOX_REG_COUNT, 1, mbox_cmd[0], 
mbox_sts[0]) !=
QLA_SUCCESS) {
dma_free_coherent(ha-pdev-dev,
  sizeof(struct init_fw_ctrl_blk),
@@ -283,51 +296,56 @@ int qla4xxx_initialize_fw_cb(struct scsi
qla4xxx_init_rings(ha);
 
/* Fill in the request and response queue information. */
-   init_fw_cb-ReqQConsumerIndex = cpu_to_le16(ha-request_out);
-   init_fw_cb-ComplQProducerIndex = cpu_to_le16(ha-response_in);
-   init_fw_cb-ReqQLen = __constant_cpu_to_le16(REQUEST_QUEUE_DEPTH);
-   init_fw_cb-ComplQLen = __constant_cpu_to_le16(RESPONSE_QUEUE_DEPTH);
-   init_fw_cb-ReqQAddrLo = cpu_to_le32(LSDW(ha-request_dma));
-   init_fw_cb-ReqQAddrHi = cpu_to_le32(MSDW(ha-request_dma));
-   init_fw_cb-ComplQAddrLo = cpu_to_le32(LSDW(ha-response_dma));
-   init_fw_cb-ComplQAddrHi = cpu_to_le32(MSDW(ha-response_dma));
-   init_fw_cb-ShadowRegBufAddrLo =
+   init_fw_cb-pri.rqq_consumer_idx = cpu_to_le16(ha-request_out);
+   init_fw_cb-pri.compq_producer_idx = cpu_to_le16(ha-response_in);
+   init_fw_cb-pri.rqq_len = __constant_cpu_to_le16(REQUEST_QUEUE_DEPTH);
+   init_fw_cb-pri.compq_len = 
__constant_cpu_to_le16(RESPONSE_QUEUE_DEPTH);
+   init_fw_cb-pri.rqq_addr_lo = cpu_to_le32(LSDW(ha-request_dma));
+   init_fw_cb-pri.rqq_addr_hi = cpu_to_le32(MSDW(ha-request_dma));
+   init_fw_cb-pri.compq_addr_lo = cpu_to_le32(LSDW(ha-response_dma));
+   init_fw_cb-pri.compq_addr_hi = cpu_to_le32(MSDW(ha-response_dma));
+   init_fw_cb-pri.shdwreg_addr_lo =
cpu_to_le32(LSDW(ha-shadow_regs_dma));
-   init_fw_cb-ShadowRegBufAddrHi =
+   init_fw_cb-pri.shdwreg_addr_hi =
cpu_to_le32(MSDW(ha-shadow_regs_dma));
 
/* Set up required options. */
-   init_fw_cb-FwOptions |=
+   init_fw_cb-pri.fw_options |=
__constant_cpu_to_le16(FWOPT_SESSION_MODE |
   FWOPT_INITIATOR_MODE);
-   init_fw_cb-FwOptions = __constant_cpu_to_le16(~FWOPT_TARGET_MODE);
+   init_fw_cb-pri.fw_options = 
__constant_cpu_to_le16(~FWOPT_TARGET_MODE);
 
/* Save some info in adapter structure. */
-   ha-firmware_options = le16_to_cpu(init_fw_cb-FwOptions);
-   ha-tcp_options = le16_to_cpu(init_fw_cb-TCPOptions);
-   

[RFC] [PATCH 5/5] qla4xxx: Add IPv6 support and misc

2007-05-02 Thread David C Somayajulu
Signed-off-by: David Somayajulu [EMAIL PROTECTED]

---
 drivers/scsi/qla4xxx/ql4_dbg.c |5 
 drivers/scsi/qla4xxx/ql4_glbl.h|   12 +
 drivers/scsi/qla4xxx/ql4_iocb.c|   39 ++-
 drivers/scsi/qla4xxx/ql4_nvram.c   |4 
 drivers/scsi/qla4xxx/ql4_os.c  |   28 ++
 drivers/scsi/qla4xxx/ql4_version.h |3 

diff --git a/drivers/scsi/qla4xxx/ql4_dbg.c b/drivers/scsi/qla4xxx/ql4_dbg.c
index 7b4e077..81fac0f 100644
--- a/drivers/scsi/qla4xxx/ql4_dbg.c
+++ b/drivers/scsi/qla4xxx/ql4_dbg.c
@@ -6,6 +6,11 @@
  */
 
 #include ql4_def.h
+#include ql4_version.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
+
 #include scsi/scsi_dbg.h
 
 static void qla4xxx_print_srb_info(struct srb * srb)
diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h
index e021eb5..188b4e5 100644
--- a/drivers/scsi/qla4xxx/ql4_glbl.h
+++ b/drivers/scsi/qla4xxx/ql4_glbl.h
@@ -8,6 +8,9 @@
 #ifndef __QLA4x_GBL_H
 #define__QLA4x_GBL_H
 
+struct iscsi_cls_conn;
+
+void qla4xxx_hw_reset(struct scsi_qla_host *ha);
 int ql4xxx_lock_drvr_wait(struct scsi_qla_host *a);
 int qla4xxx_send_tgts(struct scsi_qla_host *ha, char *ip, uint16_t port);
 int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb);
@@ -67,14 +70,19 @@ void qla4xxx_interrupt_service_routine(s
   uint32_t intr_status);
 int qla4xxx_init_rings(struct scsi_qla_host * ha);
 void qla4xxx_dump_buffer(void *b, uint32_t size);
-struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha, uint32_t 
index);
+struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha,
+   uint32_t index);
 void qla4xxx_srb_compl(struct scsi_qla_host *ha, struct srb *srb);
 int qla4xxx_reinitialize_ddb_list(struct scsi_qla_host * ha);
 int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha,
uint32_t fw_ddb_index, uint32_t state);
 
+int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount,
+   uint8_t outCount, uint32_t *mbx_cmd,
+   uint32_t *mbx_sts);
+
 extern int ql4xextended_error_logging;
 extern int ql4xdiscoverywait;
 extern int ql4xdontresethba;
 extern int ql4_mod_unload;
-#endif /* _QLA4x_GBL_H */
+#endif /* _QLA4x_GBL_H */
diff --git a/drivers/scsi/qla4xxx/ql4_iocb.c b/drivers/scsi/qla4xxx/ql4_iocb.c
index d41ce38..51f6753 100644
--- a/drivers/scsi/qla4xxx/ql4_iocb.c
+++ b/drivers/scsi/qla4xxx/ql4_iocb.c
@@ -6,6 +6,11 @@
  */
 
 #include ql4_def.h
+#include ql4_version.h
+#include ql4_glbl.h
+#include ql4_dbg.h
+#include ql4_inline.h
+
 
 #include scsi/scsi_tcq.h
 
@@ -233,23 +238,27 @@ int qla4xxx_send_command_to_isp(struct s
index = (uint32_t)cmd-request-tag;
 
/* Calculate the number of request entries needed. */
-   if (cmd-use_sg) {
-   sg = (struct scatterlist *)cmd-request_buffer;
-   tot_dsds = pci_map_sg(ha-pdev, sg, cmd-use_sg,
- cmd-sc_data_direction);
-   if (tot_dsds == 0)
-   goto queuing_error;
-   } else if (cmd-request_bufflen) {
-   dma_addr_t  req_dma;
-
-   req_dma = pci_map_single(ha-pdev, cmd-request_buffer,
+   if (srb-flags  SRB_SCSI_PASSTHRU) {
+   tot_dsds = 1;
+   } else {
+   if (cmd-use_sg) {
+   sg = (struct scatterlist *)cmd-request_buffer;
+   tot_dsds = pci_map_sg(ha-pdev, sg, cmd-use_sg,
+ cmd-sc_data_direction);
+   if (tot_dsds == 0)
+   goto queuing_error;
+   } else if (cmd-request_bufflen) {
+   dma_addr_t  req_dma;
+
+   req_dma = pci_map_single(ha-pdev, cmd-request_buffer,
 cmd-request_bufflen,
 cmd-sc_data_direction);
-   if (dma_mapping_error(req_dma))
-   goto queuing_error;
+   if (dma_mapping_error(req_dma))
+   goto queuing_error;
 
-   srb-dma_handle = req_dma;
-   tot_dsds = 1;
+   srb-dma_handle = req_dma;
+   tot_dsds = 1;
+   }
}
req_cnt = qla4xxx_calc_request_entries(tot_dsds);
 
@@ -359,6 +368,8 @@ int qla4xxx_send_command_to_isp(struct s
return QLA_SUCCESS;
 
 queuing_error:
+   if (srb-flags  SRB_SCSI_PASSTHRU)
+   return QLA_ERROR;
 
if (cmd-use_sg  tot_dsds) {
sg = (struct scatterlist *) cmd-request_buffer;
diff --git a/drivers/scsi/qla4xxx/ql4_nvram.c b/drivers/scsi/qla4xxx/ql4_nvram.c
index 58afd13..67cfd0a 100644
--- a/drivers/scsi/qla4xxx/ql4_nvram.c
+++ b/drivers/scsi/qla4xxx/ql4_nvram.c
@@ -6,6 +6,10 @@

[PATCH] qla4xxx: bug fixes

2007-01-22 Thread David C Somayajulu
The included patch fixes the following issues:
1. qla3xxx/qla4xxx co-existence issue which can result in a lockup when qla3xxx 
driver is unloaded, or when ifdown; ifup is performed on one of the interfaces 
correponding to qla3xxx. This is because qla4xxx HBA supports one ethernet and 
iscsi interfaces per port. Both iscsi and ethernet interfaces share the same 
state machine. The problem has to do with synchronizing access to the state 
machine in the event of a reset
2. mutex_lock() is sometimes not followed by mutex_unlock() prior to invoking a 
msleep() in qla4xxx_mailbox_command()

Thanks
David Somayajulu

---
 drivers/scsi/qla4xxx/ql4_def.h |1 -
 drivers/scsi/qla4xxx/ql4_glbl.h|1 +
 drivers/scsi/qla4xxx/ql4_init.c|   18 +-
 drivers/scsi/qla4xxx/ql4_isr.c |4 +-
 drivers/scsi/qla4xxx/ql4_mbx.c |   35 
 drivers/scsi/qla4xxx/ql4_os.c  |   64 ++--
 drivers/scsi/qla4xxx/ql4_version.h |2 +
 7 files changed, 73 insertions(+), 52 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
index 4249e52..6f4cf2d 100644
--- a/drivers/scsi/qla4xxx/ql4_def.h
+++ b/drivers/scsi/qla4xxx/ql4_def.h
@@ -418,7 +418,6 @@ #define MEM_ALIGN_VALUE \
 * concurrently.
 */
struct mutex  mbox_sem;
-   wait_queue_head_t mailbox_wait_queue;
 
/* temporary mailbox status registers */
volatile uint8_t mbox_status_count;
diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h
index 2122967..e021eb5 100644
--- a/drivers/scsi/qla4xxx/ql4_glbl.h
+++ b/drivers/scsi/qla4xxx/ql4_glbl.h
@@ -76,4 +76,5 @@ int qla4xxx_process_ddb_changed(struct s
 extern int ql4xextended_error_logging;
 extern int ql4xdiscoverywait;
 extern int ql4xdontresethba;
+extern int ql4_mod_unload;
 #endif /* _QLA4x_GBL_H */
diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c
index cc210f2..b907b06 100644
--- a/drivers/scsi/qla4xxx/ql4_init.c
+++ b/drivers/scsi/qla4xxx/ql4_init.c
@@ -958,25 +958,25 @@ static int qla4xxx_start_firmware_from_f
return status;
 }
 
-int ql4xxx_lock_drvr_wait(struct scsi_qla_host *a)
+int ql4xxx_lock_drvr_wait(struct scsi_qla_host *ha)
 {
-#define QL4_LOCK_DRVR_WAIT 300
-#define QL4_LOCK_DRVR_SLEEP100
+#define QL4_LOCK_DRVR_WAIT 30
+#define QL4_LOCK_DRVR_SLEEP1
 
int drvr_wait = QL4_LOCK_DRVR_WAIT;
while (drvr_wait) {
-   if (ql4xxx_lock_drvr(a) == 0) {
-   msleep(QL4_LOCK_DRVR_SLEEP);
+   if (ql4xxx_lock_drvr(ha) == 0) {
+   ssleep(QL4_LOCK_DRVR_SLEEP);
if (drvr_wait) {
DEBUG2(printk(scsi%ld: %s: Waiting for 
- Global Init Semaphore...n,
- a-host_no,
- __func__));
+ Global Init Semaphore(%d)...n,
+ ha-host_no,
+ __func__, drvr_wait));
}
drvr_wait -= QL4_LOCK_DRVR_SLEEP;
} else {
DEBUG2(printk(scsi%ld: %s: Global Init Semaphore 
- acquired.n, a-host_no, __func__));
+ acquired.n, ha-host_no, __func__));
return QLA_SUCCESS;
}
}
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
index ef975e0..35b9e36 100644
--- a/drivers/scsi/qla4xxx/ql4_isr.c
+++ b/drivers/scsi/qla4xxx/ql4_isr.c
@@ -433,7 +433,6 @@ static void qla4xxx_isr_decode_mailbox(s
readl(ha-reg-mailbox[i]);
 
set_bit(AF_MBOX_COMMAND_DONE, ha-flags);
-   wake_up(ha-mailbox_wait_queue);
}
} else if (mbox_status  12 == MBOX_ASYNC_EVENT_STATUS) {
/* Immediately process the AENs that don't require much work.
@@ -686,7 +685,8 @@ irqreturn_t qla4xxx_intr_handler(int irq
   ha-reg-ctrl_status);
readl(ha-reg-ctrl_status);
 
-   set_bit(DPC_RESET_HA_INTR, ha-dpc_flags);
+   if (!ql4_mod_unload)
+   set_bit(DPC_RESET_HA_INTR, ha-dpc_flags);
 
break;
} else if (intr_status  INTR_PENDING) {
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c
index b721dc5..d1ef229 100644
--- a/drivers/scsi/qla4xxx/ql4_mbx.c
+++ b/drivers/scsi/qla4xxx/ql4_mbx.c
@@ -29,19 +29,31 @@ int qla4xxx_mailbox_command(struct scsi_
u_long wait_count;
uint32_t intr_status;
unsigned long flags = 0;
-   DECLARE_WAITQUEUE(wait, 

Re: [PATCH] [SCSI] qla4xxx: fix for timing issue for nvram accesses.

2006-11-17 Thread David C Somayajulu
This patch fixes a timing issue related to nvram accesses in qla4xxx driver for 
some cpu/slot speed combination.

Signed-off-by: David Somayajulu [EMAIL PROTECTED]

---
 drivers/scsi/qla4xxx/ql4_nvram.c |   19 +++
 1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_nvram.c b/drivers/scsi/qla4xxx/ql4_nvram.c
index fc50203..a84ed3e 100644
--- a/drivers/scsi/qla4xxx/ql4_nvram.c
+++ b/drivers/scsi/qla4xxx/ql4_nvram.c
@@ -29,7 +29,9 @@ static int fm93c56a_select(struct scsi_q
 
ha-eeprom_cmd_data = AUBURN_EEPROM_CS_1 | 0x000f;
writel(ha-eeprom_cmd_data, isp_nvram(ha));
+   udelay(1);
readl(isp_nvram(ha));
+   udelay(1);
return 1;
 }
 
@@ -42,11 +44,15 @@ static int fm93c56a_cmd(struct scsi_qla_
 
/* Clock in a zero, then do the start bit. */
writel(ha-eeprom_cmd_data | AUBURN_EEPROM_DO_1, isp_nvram(ha));
+   udelay(1);
writel(ha-eeprom_cmd_data | AUBURN_EEPROM_DO_1 |
   AUBURN_EEPROM_CLK_RISE, isp_nvram(ha));
+   udelay(1);
writel(ha-eeprom_cmd_data | AUBURN_EEPROM_DO_1 |
   AUBURN_EEPROM_CLK_FALL, isp_nvram(ha));
+   udelay(1);
readl(isp_nvram(ha));
+   udelay(1);
mask = 1  (FM93C56A_CMD_BITS - 1);
 
/* Force the previous data bit to be different. */
@@ -61,13 +67,17 @@ static int fm93c56a_cmd(struct scsi_qla_
 * match.
 */
writel(ha-eeprom_cmd_data | dataBit, isp_nvram(ha));
+   udelay(1);
previousBit = dataBit;
}
writel(ha-eeprom_cmd_data | dataBit |
   AUBURN_EEPROM_CLK_RISE, isp_nvram(ha));
+   udelay(1);
writel(ha-eeprom_cmd_data | dataBit |
   AUBURN_EEPROM_CLK_FALL, isp_nvram(ha));
+   udelay(1);
readl(isp_nvram(ha));
+   udelay(1);
cmd = cmd  1;
}
mask = 1  (eeprom_no_addr_bits(ha) - 1);
@@ -83,13 +93,17 @@ static int fm93c56a_cmd(struct scsi_qla_
 * match.
 */
writel(ha-eeprom_cmd_data | dataBit, isp_nvram(ha));
+   udelay(1);
previousBit = dataBit;
}
writel(ha-eeprom_cmd_data | dataBit |
   AUBURN_EEPROM_CLK_RISE, isp_nvram(ha));
+   udelay(1);
writel(ha-eeprom_cmd_data | dataBit |
   AUBURN_EEPROM_CLK_FALL, isp_nvram(ha));
+   udelay(1);
readl(isp_nvram(ha));
+   udelay(1);
addr = addr  1;
}
return 1;
@@ -99,7 +113,9 @@ static int fm93c56a_deselect(struct scsi
 {
ha-eeprom_cmd_data = AUBURN_EEPROM_CS_0 | 0x000f;
writel(ha-eeprom_cmd_data, isp_nvram(ha));
+   udelay(1);
readl(isp_nvram(ha));
+   udelay(1);
return 1;
 }
 
@@ -114,10 +130,13 @@ static int fm93c56a_datain(struct scsi_q
for (i = 0; i  eeprom_no_data_bits(ha); i++) {
writel(ha-eeprom_cmd_data |
   AUBURN_EEPROM_CLK_RISE, isp_nvram(ha));
+   udelay(1);
writel(ha-eeprom_cmd_data |
   AUBURN_EEPROM_CLK_FALL, isp_nvram(ha));
+   udelay(1);
dataBit =
(readw(isp_nvram(ha))  AUBURN_EEPROM_DI_1) ? 1 : 0;
+   udelay(1);
data = (data  1) | dataBit;
}
 
-- 
1.4.2.3


-
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html