[SCSI] fusion: extended config header support
Acked by: Moore, Eric Dean <Eric.Moore@lsil.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
1ff927306e
commit
69218ee518
|
@ -491,10 +491,21 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
|
|||
|
||||
pCfg->status = status;
|
||||
if (status == MPI_IOCSTATUS_SUCCESS) {
|
||||
pCfg->hdr->PageVersion = pReply->Header.PageVersion;
|
||||
pCfg->hdr->PageLength = pReply->Header.PageLength;
|
||||
pCfg->hdr->PageNumber = pReply->Header.PageNumber;
|
||||
pCfg->hdr->PageType = pReply->Header.PageType;
|
||||
if ((pReply->Header.PageType &
|
||||
MPI_CONFIG_PAGETYPE_MASK) ==
|
||||
MPI_CONFIG_PAGETYPE_EXTENDED) {
|
||||
pCfg->cfghdr.ehdr->ExtPageLength =
|
||||
le16_to_cpu(pReply->ExtPageLength);
|
||||
pCfg->cfghdr.ehdr->ExtPageType =
|
||||
pReply->ExtPageType;
|
||||
}
|
||||
pCfg->cfghdr.hdr->PageVersion = pReply->Header.PageVersion;
|
||||
|
||||
/* If this is a regular header, save PageLength. */
|
||||
/* LMP Do this better so not using a reserved field! */
|
||||
pCfg->cfghdr.hdr->PageLength = pReply->Header.PageLength;
|
||||
pCfg->cfghdr.hdr->PageNumber = pReply->Header.PageNumber;
|
||||
pCfg->cfghdr.hdr->PageType = pReply->Header.PageType;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3819,7 +3830,7 @@ GetLanConfigPages(MPT_ADAPTER *ioc)
|
|||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 0;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_LAN;
|
||||
cfg.hdr = &hdr;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
|
@ -3863,7 +3874,7 @@ GetLanConfigPages(MPT_ADAPTER *ioc)
|
|||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 1;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_LAN;
|
||||
cfg.hdr = &hdr;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
|
@ -3930,7 +3941,7 @@ GetFcPortPage0(MPT_ADAPTER *ioc, int portnum)
|
|||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 0;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT;
|
||||
cfg.hdr = &hdr;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
|
@ -4012,7 +4023,7 @@ GetIoUnitPage2(MPT_ADAPTER *ioc)
|
|||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 2;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_IO_UNIT;
|
||||
cfg.hdr = &hdr;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
|
@ -4102,7 +4113,7 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)
|
|||
header.PageLength = 0;
|
||||
header.PageNumber = 0;
|
||||
header.PageType = MPI_CONFIG_PAGETYPE_SCSI_PORT;
|
||||
cfg.hdr = &header;
|
||||
cfg.cfghdr.hdr = &header;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = portnum;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -4168,7 +4179,7 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)
|
|||
header.PageLength = 0;
|
||||
header.PageNumber = 2;
|
||||
header.PageType = MPI_CONFIG_PAGETYPE_SCSI_PORT;
|
||||
cfg.hdr = &header;
|
||||
cfg.cfghdr.hdr = &header;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = portnum;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -4236,7 +4247,7 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
|
|||
header.PageLength = 0;
|
||||
header.PageNumber = 1;
|
||||
header.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
|
||||
cfg.hdr = &header;
|
||||
cfg.cfghdr.hdr = &header;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = portnum;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -4245,8 +4256,8 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
|
|||
if (mpt_config(ioc, &cfg) != 0)
|
||||
return -EFAULT;
|
||||
|
||||
ioc->spi_data.sdp1version = cfg.hdr->PageVersion;
|
||||
ioc->spi_data.sdp1length = cfg.hdr->PageLength;
|
||||
ioc->spi_data.sdp1version = cfg.cfghdr.hdr->PageVersion;
|
||||
ioc->spi_data.sdp1length = cfg.cfghdr.hdr->PageLength;
|
||||
|
||||
header.PageVersion = 0;
|
||||
header.PageLength = 0;
|
||||
|
@ -4255,8 +4266,8 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
|
|||
if (mpt_config(ioc, &cfg) != 0)
|
||||
return -EFAULT;
|
||||
|
||||
ioc->spi_data.sdp0version = cfg.hdr->PageVersion;
|
||||
ioc->spi_data.sdp0length = cfg.hdr->PageLength;
|
||||
ioc->spi_data.sdp0version = cfg.cfghdr.hdr->PageVersion;
|
||||
ioc->spi_data.sdp0length = cfg.cfghdr.hdr->PageLength;
|
||||
|
||||
dcprintk((MYIOC_s_INFO_FMT "Headers: 0: version %d length %d\n",
|
||||
ioc->name, ioc->spi_data.sdp0version, ioc->spi_data.sdp0length));
|
||||
|
@ -4298,7 +4309,7 @@ mpt_findImVolumes(MPT_ADAPTER *ioc)
|
|||
header.PageLength = 0;
|
||||
header.PageNumber = 2;
|
||||
header.PageType = MPI_CONFIG_PAGETYPE_IOC;
|
||||
cfg.hdr = &header;
|
||||
cfg.cfghdr.hdr = &header;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = 0;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -4394,7 +4405,7 @@ mpt_read_ioc_pg_3(MPT_ADAPTER *ioc)
|
|||
header.PageLength = 0;
|
||||
header.PageNumber = 3;
|
||||
header.PageType = MPI_CONFIG_PAGETYPE_IOC;
|
||||
cfg.hdr = &header;
|
||||
cfg.cfghdr.hdr = &header;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = 0;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -4446,7 +4457,7 @@ mpt_read_ioc_pg_4(MPT_ADAPTER *ioc)
|
|||
header.PageLength = 0;
|
||||
header.PageNumber = 4;
|
||||
header.PageType = MPI_CONFIG_PAGETYPE_IOC;
|
||||
cfg.hdr = &header;
|
||||
cfg.cfghdr.hdr = &header;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = 0;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -4498,7 +4509,7 @@ mpt_read_ioc_pg_1(MPT_ADAPTER *ioc)
|
|||
header.PageLength = 0;
|
||||
header.PageNumber = 1;
|
||||
header.PageType = MPI_CONFIG_PAGETYPE_IOC;
|
||||
cfg.hdr = &header;
|
||||
cfg.cfghdr.hdr = &header;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = 0;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -4647,10 +4658,11 @@ int
|
|||
mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
|
||||
{
|
||||
Config_t *pReq;
|
||||
ConfigExtendedPageHeader_t *pExtHdr = NULL;
|
||||
MPT_FRAME_HDR *mf;
|
||||
unsigned long flags;
|
||||
int ii, rc;
|
||||
u32 flagsLength;
|
||||
int flagsLength;
|
||||
int in_isr;
|
||||
|
||||
/* Prevent calling wait_event() (below), if caller happens
|
||||
|
@ -4675,16 +4687,30 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
|
|||
pReq->Reserved = 0;
|
||||
pReq->ChainOffset = 0;
|
||||
pReq->Function = MPI_FUNCTION_CONFIG;
|
||||
|
||||
/* Assume page type is not extended and clear "reserved" fields. */
|
||||
pReq->ExtPageLength = 0;
|
||||
pReq->ExtPageType = 0;
|
||||
pReq->MsgFlags = 0;
|
||||
|
||||
for (ii=0; ii < 8; ii++)
|
||||
pReq->Reserved2[ii] = 0;
|
||||
|
||||
pReq->Header.PageVersion = pCfg->hdr->PageVersion;
|
||||
pReq->Header.PageLength = pCfg->hdr->PageLength;
|
||||
pReq->Header.PageNumber = pCfg->hdr->PageNumber;
|
||||
pReq->Header.PageType = (pCfg->hdr->PageType & MPI_CONFIG_PAGETYPE_MASK);
|
||||
pReq->Header.PageVersion = pCfg->cfghdr.hdr->PageVersion;
|
||||
pReq->Header.PageLength = pCfg->cfghdr.hdr->PageLength;
|
||||
pReq->Header.PageNumber = pCfg->cfghdr.hdr->PageNumber;
|
||||
pReq->Header.PageType = (pCfg->cfghdr.hdr->PageType & MPI_CONFIG_PAGETYPE_MASK);
|
||||
|
||||
if ((pCfg->cfghdr.hdr->PageType & MPI_CONFIG_PAGETYPE_MASK) == MPI_CONFIG_PAGETYPE_EXTENDED) {
|
||||
pExtHdr = (ConfigExtendedPageHeader_t *)pCfg->cfghdr.ehdr;
|
||||
pReq->ExtPageLength = cpu_to_le16(pExtHdr->ExtPageLength);
|
||||
pReq->ExtPageType = pExtHdr->ExtPageType;
|
||||
pReq->Header.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
|
||||
|
||||
/* Page Length must be treated as a reserved field for the extended header. */
|
||||
pReq->Header.PageLength = 0;
|
||||
}
|
||||
|
||||
pReq->PageAddress = cpu_to_le32(pCfg->pageAddr);
|
||||
|
||||
/* Add a SGE to the config request.
|
||||
|
@ -4694,12 +4720,20 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
|
|||
else
|
||||
flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ;
|
||||
|
||||
flagsLength |= pCfg->hdr->PageLength * 4;
|
||||
if ((pCfg->cfghdr.hdr->PageType & MPI_CONFIG_PAGETYPE_MASK) == MPI_CONFIG_PAGETYPE_EXTENDED) {
|
||||
flagsLength |= pExtHdr->ExtPageLength * 4;
|
||||
|
||||
mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, pCfg->physAddr);
|
||||
dcprintk((MYIOC_s_INFO_FMT "Sending Config request type %d, page %d and action %d\n",
|
||||
ioc->name, pReq->ExtPageType, pReq->Header.PageNumber, pReq->Action));
|
||||
}
|
||||
else {
|
||||
flagsLength |= pCfg->cfghdr.hdr->PageLength * 4;
|
||||
|
||||
dcprintk((MYIOC_s_INFO_FMT "Sending Config request type %d, page %d and action %d\n",
|
||||
ioc->name, pReq->Header.PageType, pReq->Header.PageNumber, pReq->Action));
|
||||
}
|
||||
|
||||
mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, pCfg->physAddr);
|
||||
|
||||
/* Append pCfg pointer to end of mf
|
||||
*/
|
||||
|
|
|
@ -915,7 +915,10 @@ struct scsi_cmnd;
|
|||
typedef struct _x_config_parms {
|
||||
struct list_head linkage; /* linked list */
|
||||
struct timer_list timer; /* timer function for this request */
|
||||
union {
|
||||
ConfigExtendedPageHeader_t *ehdr;
|
||||
ConfigPageHeader_t *hdr;
|
||||
} cfghdr;
|
||||
dma_addr_t physAddr;
|
||||
int wait_done; /* wait for this request */
|
||||
u32 pageAddr; /* properly formatted */
|
||||
|
|
|
@ -2324,7 +2324,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
|
|||
hdr.PageLength = 0;
|
||||
hdr.PageNumber = 0;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING;
|
||||
cfg.hdr = &hdr;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = 0;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -2333,7 +2333,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
|
|||
|
||||
strncpy(karg.serial_number, " ", 24);
|
||||
if (mpt_config(ioc, &cfg) == 0) {
|
||||
if (cfg.hdr->PageLength > 0) {
|
||||
if (cfg.cfghdr.hdr->PageLength > 0) {
|
||||
/* Issue the second config page request */
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
|
||||
|
@ -2479,7 +2479,7 @@ mptctl_hp_targetinfo(unsigned long arg)
|
|||
hdr.PageNumber = 0;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
|
||||
|
||||
cfg.hdr = &hdr;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
cfg.dir = 0;
|
||||
cfg.timeout = 0;
|
||||
|
@ -2527,15 +2527,15 @@ mptctl_hp_targetinfo(unsigned long arg)
|
|||
hdr.PageNumber = 3;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
|
||||
|
||||
cfg.hdr = &hdr;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0;
|
||||
cfg.timeout = 0;
|
||||
cfg.physAddr = -1;
|
||||
if ((mpt_config(ioc, &cfg) == 0) && (cfg.hdr->PageLength > 0)) {
|
||||
if ((mpt_config(ioc, &cfg) == 0) && (cfg.cfghdr.hdr->PageLength > 0)) {
|
||||
/* Issue the second config page request */
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
data_sz = (int) cfg.hdr->PageLength * 4;
|
||||
data_sz = (int) cfg.cfghdr.hdr->PageLength * 4;
|
||||
pg3_alloc = (SCSIDevicePage3_t *) pci_alloc_consistent(
|
||||
ioc->pcidev, data_sz, &page_dma);
|
||||
if (pg3_alloc) {
|
||||
|
|
|
@ -3955,7 +3955,7 @@ mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, int portnum)
|
|||
header1.PageLength = ioc->spi_data.sdp1length;
|
||||
header1.PageNumber = 1;
|
||||
header1.PageType = MPI_CONFIG_PAGETYPE_SCSI_DEVICE;
|
||||
cfg.hdr = &header1;
|
||||
cfg.cfghdr.hdr = &header1;
|
||||
cfg.physAddr = cfg1_dma_addr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
|
||||
cfg.dir = 1;
|
||||
|
@ -4353,7 +4353,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
|
|||
/* Prep cfg structure
|
||||
*/
|
||||
cfg.pageAddr = (bus<<8) | id;
|
||||
cfg.hdr = NULL;
|
||||
cfg.cfghdr.hdr = NULL;
|
||||
|
||||
/* Prep SDP0 header
|
||||
*/
|
||||
|
@ -4399,7 +4399,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
|
|||
pcfg1Data = (SCSIDevicePage1_t *) (pDvBuf + sz);
|
||||
cfg1_dma_addr = dvbuf_dma + sz;
|
||||
|
||||
/* Skip this ID? Set cfg.hdr to force config page write
|
||||
/* Skip this ID? Set cfg.cfghdr.hdr to force config page write
|
||||
*/
|
||||
{
|
||||
ScsiCfgData *pspi_data = &hd->ioc->spi_data;
|
||||
|
@ -4417,7 +4417,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
|
|||
|
||||
dv.cmd = MPT_SET_MAX;
|
||||
mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data);
|
||||
cfg.hdr = &header1;
|
||||
cfg.cfghdr.hdr = &header1;
|
||||
|
||||
/* Save the final negotiated settings to
|
||||
* SCSI device page 1.
|
||||
|
@ -4483,7 +4483,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
|
|||
dv.cmd = MPT_SET_MIN;
|
||||
mptscsih_dv_parms(hd, &dv, (void *)pcfg1Data);
|
||||
|
||||
cfg.hdr = &header1;
|
||||
cfg.cfghdr.hdr = &header1;
|
||||
cfg.physAddr = cfg1_dma_addr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
|
||||
cfg.dir = 1;
|
||||
|
@ -4637,7 +4637,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
|
|||
u32 sdp0_info;
|
||||
u32 sdp0_nego;
|
||||
|
||||
cfg.hdr = &header0;
|
||||
cfg.cfghdr.hdr = &header0;
|
||||
cfg.physAddr = cfg0_dma_addr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
cfg.dir = 0;
|
||||
|
@ -4722,7 +4722,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus_number, int id)
|
|||
* 4) release
|
||||
* 5) update nego parms to target struct
|
||||
*/
|
||||
cfg.hdr = &header1;
|
||||
cfg.cfghdr.hdr = &header1;
|
||||
cfg.physAddr = cfg1_dma_addr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
|
||||
cfg.dir = 1;
|
||||
|
@ -5121,7 +5121,7 @@ target_done:
|
|||
|
||||
/* Set if cfg1_dma_addr contents is valid
|
||||
*/
|
||||
if ((cfg.hdr != NULL) && (retcode == 0)){
|
||||
if ((cfg.cfghdr.hdr != NULL) && (retcode == 0)){
|
||||
/* If disk, not U320, disable QAS
|
||||
*/
|
||||
if ((inq0 == 0) && (dv.now.factor > MPT_ULTRA320)) {
|
||||
|
@ -5137,7 +5137,7 @@ target_done:
|
|||
* skip save of the final negotiated settings to
|
||||
* SCSI device page 1.
|
||||
*
|
||||
cfg.hdr = &header1;
|
||||
cfg.cfghdr.hdr = &header1;
|
||||
cfg.physAddr = cfg1_dma_addr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
|
||||
cfg.dir = 1;
|
||||
|
|
Loading…
Reference in New Issue