mirror of https://gitee.com/openkylin/linux.git
[SCSI] qla4xxx: Recreate chap data list during get chap operation
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>
This commit is contained in:
parent
fb734ee3ef
commit
ea507a2530
|
@ -573,6 +573,65 @@ static umode_t qla4_attr_is_visible(int param_type, int param)
|
||||||
return 0;
|
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,
|
static int qla4xxx_get_chap_by_index(struct scsi_qla_host *ha,
|
||||||
int16_t chap_index,
|
int16_t chap_index,
|
||||||
struct ql4_chap_table **chap_entry)
|
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;
|
goto exit_get_chap_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qla4xxx_create_chap_list(ha);
|
||||||
|
|
||||||
chap_rec = (struct iscsi_chap_rec *) buf;
|
chap_rec = (struct iscsi_chap_rec *) buf;
|
||||||
mutex_lock(&ha->chap_sem);
|
mutex_lock(&ha->chap_sem);
|
||||||
for (i = chap_tbl_idx; i < max_chap_entries; i++) {
|
for (i = chap_tbl_idx; i < max_chap_entries; i++) {
|
||||||
|
@ -6124,64 +6185,6 @@ static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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,
|
static void qla4xxx_get_param_ddb(struct ddb_entry *ddb_entry,
|
||||||
struct ql4_tuple_ddb *tddb)
|
struct ql4_tuple_ddb *tddb)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue