]> Pileus Git - ~andy/linux/commitdiff
[SCSI] qla4xxx: Recreate chap data list during get chap operation
authorAdheer Chandravanshi <adheer.chandravanshi@qlogic.com>
Fri, 22 Nov 2013 10:28:23 +0000 (05:28 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 20 Dec 2013 04:56:27 +0000 (20:56 -0800)
Recreate the chap data list during the get chap operation in
qla4xxx_get_chap_list().

Signed-off-by: Adheer Chandravanshi <adheer.chandravanshi@qlogic.com>
Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla4xxx/ql4_os.c

index 9b8a2c342b5df5d1a9ad64ba30917d785e91f4a0..c21adc338cf1a93e8c3da62d12febae96c9acd25 100644 (file)
@@ -573,6 +573,65 @@ static umode_t qla4_attr_is_visible(int param_type, int param)
        return 0;
 }
 
+/**
+ * qla4xxx_create chap_list - Create CHAP list from FLASH
+ * @ha: pointer to adapter structure
+ *
+ * Read flash and make a list of CHAP entries, during login when a CHAP entry
+ * is received, it will be checked in this list. If entry exist then the CHAP
+ * entry index is set in the DDB. If CHAP entry does not exist in this list
+ * then a new entry is added in FLASH in CHAP table and the index obtained is
+ * used in the DDB.
+ **/
+static void qla4xxx_create_chap_list(struct scsi_qla_host *ha)
+{
+       int rval = 0;
+       uint8_t *chap_flash_data = NULL;
+       uint32_t offset;
+       dma_addr_t chap_dma;
+       uint32_t chap_size = 0;
+
+       if (is_qla40XX(ha))
+               chap_size = MAX_CHAP_ENTRIES_40XX *
+                           sizeof(struct ql4_chap_table);
+       else    /* Single region contains CHAP info for both
+                * ports which is divided into half for each port.
+                */
+               chap_size = ha->hw.flt_chap_size / 2;
+
+       chap_flash_data = dma_alloc_coherent(&ha->pdev->dev, chap_size,
+                                            &chap_dma, GFP_KERNEL);
+       if (!chap_flash_data) {
+               ql4_printk(KERN_ERR, ha, "No memory for chap_flash_data\n");
+               return;
+       }
+
+       if (is_qla40XX(ha)) {
+               offset = FLASH_CHAP_OFFSET;
+       } else {
+               offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2);
+               if (ha->port_num == 1)
+                       offset += chap_size;
+       }
+
+       rval = qla4xxx_get_flash(ha, chap_dma, offset, chap_size);
+       if (rval != QLA_SUCCESS)
+               goto exit_chap_list;
+
+       if (ha->chap_list == NULL)
+               ha->chap_list = vmalloc(chap_size);
+       if (ha->chap_list == NULL) {
+               ql4_printk(KERN_ERR, ha, "No memory for ha->chap_list\n");
+               goto exit_chap_list;
+       }
+
+       memset(ha->chap_list, 0, chap_size);
+       memcpy(ha->chap_list, chap_flash_data, chap_size);
+
+exit_chap_list:
+       dma_free_coherent(&ha->pdev->dev, chap_size, chap_flash_data, chap_dma);
+}
+
 static int qla4xxx_get_chap_by_index(struct scsi_qla_host *ha,
                                     int16_t chap_index,
                                     struct ql4_chap_table **chap_entry)
@@ -686,6 +745,8 @@ static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx,
                goto exit_get_chap_list;
        }
 
+       qla4xxx_create_chap_list(ha);
+
        chap_rec = (struct iscsi_chap_rec *) buf;
        mutex_lock(&ha->chap_sem);
        for (i = chap_tbl_idx; i < max_chap_entries; i++) {
@@ -6124,64 +6185,6 @@ kset_free:
 }
 
 
-/**
- * qla4xxx_create chap_list - Create CHAP list from FLASH
- * @ha: pointer to adapter structure
- *
- * Read flash and make a list of CHAP entries, during login when a CHAP entry
- * is received, it will be checked in this list. If entry exist then the CHAP
- * entry index is set in the DDB. If CHAP entry does not exist in this list
- * then a new entry is added in FLASH in CHAP table and the index obtained is
- * used in the DDB.
- **/
-static void qla4xxx_create_chap_list(struct scsi_qla_host *ha)
-{
-       int rval = 0;
-       uint8_t *chap_flash_data = NULL;
-       uint32_t offset;
-       dma_addr_t chap_dma;
-       uint32_t chap_size = 0;
-
-       if (is_qla40XX(ha))
-               chap_size = MAX_CHAP_ENTRIES_40XX  *
-                                       sizeof(struct ql4_chap_table);
-       else    /* Single region contains CHAP info for both
-                * ports which is divided into half for each port.
-                */
-               chap_size = ha->hw.flt_chap_size / 2;
-
-       chap_flash_data = dma_alloc_coherent(&ha->pdev->dev, chap_size,
-                                         &chap_dma, GFP_KERNEL);
-       if (!chap_flash_data) {
-               ql4_printk(KERN_ERR, ha, "No memory for chap_flash_data\n");
-               return;
-       }
-       if (is_qla40XX(ha))
-               offset = FLASH_CHAP_OFFSET;
-       else {
-               offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2);
-               if (ha->port_num == 1)
-                       offset += chap_size;
-       }
-
-       rval = qla4xxx_get_flash(ha, chap_dma, offset, chap_size);
-       if (rval != QLA_SUCCESS)
-               goto exit_chap_list;
-
-       if (ha->chap_list == NULL)
-               ha->chap_list = vmalloc(chap_size);
-       if (ha->chap_list == NULL) {
-               ql4_printk(KERN_ERR, ha, "No memory for ha->chap_list\n");
-               goto exit_chap_list;
-       }
-
-       memcpy(ha->chap_list, chap_flash_data, chap_size);
-
-exit_chap_list:
-       dma_free_coherent(&ha->pdev->dev, chap_size,
-                       chap_flash_data, chap_dma);
-}
-
 static void qla4xxx_get_param_ddb(struct ddb_entry *ddb_entry,
                                  struct ql4_tuple_ddb *tddb)
 {