On Fri, 17 Nov 2006 12:21:32 +0100 Sven Rudolph wrote: > I try to use an Atto Dual-Channel Low-Profile PCIExpress SCSI HBA > (<http://www.attotech.com/ultra5Dlowpro.html>) with Linux (2.6.18.1, > 2.6.19rc6). > > (Atto provides a Linux driver on CD, but I prefer to use drivers > included in the vanilla Linux kernel. It looks like their driver does > not include all source code; but I might be wrong on this.) They also provide a patch for the mptspi driver (apparently made for 2.6.14): http://www.attotech.com/software/secure/lnx_drv_epciu320_2.6.14-15.patch This patch still applies to 2.6.18 with some fuzz, resulting in the following changes: diff --git a/drivers/message/fusion/lsi/mpi_cnfg.h b/drivers/message/fusion/lsi/mpi_cnfg.h index 47e13e3..6cb9c21 100644 --- a/drivers/message/fusion/lsi/mpi_cnfg.h +++ b/drivers/message/fusion/lsi/mpi_cnfg.h @@ -1440,6 +1440,30 @@ typedef struct _CONFIG_PAGE_SCSI_PORT_2 } CONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_2, SCSIPortPage2_t, MPI_POINTER pSCSIPortPage2_t; +typedef struct _ATTO_DEVICE_INFO +{ + U8 Offset; /* 00h */ + U8 Period; /* 01h */ + U16 ATTOFlags; /* 02h */ +} ATTO_DEVICE_INFO, MPI_POINTER PTR_ATTO_DEVICE_INFO, + ATTODeviceInfo_t, MPI_POINTER pATTODeviceInfo_t; + +#define ATTOFLAG_DISC 0x0001 +#define ATTOFLAG_TAGGED 0x0002 +#define ATTOFLAG_WIDE_ENB 0x0008 +#define ATTOFLAG_ID_ENB 0x0010 +#define ATTOFLAG_LUN_ENB 0x0060 + +typedef struct _ATTO_CONFIG_PAGE_SCSI_PORT_2 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U16 PortFlags; /* 04h */ + U16 Unused1; /* 06h */ + U32 Unused2; /* 08h */ + ATTO_DEVICE_INFO DeviceSettings[16]; /* 0Ch */ +} fATTO_CONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_ATTO_CONFIG_PAGE_SCSI_PORT_2, + ATTO_SCSIPortPage2_t, MPI_POINTER pATTO_SCSIPortPage2_t; + #define MPI_SCSIPORTPAGE2_PAGEVERSION (0x02) /* PortFlags values */ diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 29d0635..6b47fb0 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c @@ -1357,6 +1357,7 @@ mpt_attach(struct pci_dev *pdev, const s pci_disable_io_access(pdev); sprintf(ioc->name, "ioc%d", ioc->id); + ioc->is_ATTO = (pdev->vendor == 0x117c); spin_lock_init(&ioc->FreeQlock); @@ -4607,6 +4608,37 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc /* Nvram data is left with INVALID mark */ rc = 1; + } else if (ioc->is_ATTO) { + /* This is an ATTO adapter, read Page2 accordingly + */ + ATTO_SCSIPortPage2_t *pPP2 = (ATTO_SCSIPortPage2_t *) pbuf; + ATTODeviceInfo_t *pdevice = NULL; + U16 ATTOFlags; + + /* Save the Port Page 2 data + * (reformat into a 32bit quantity) + */ + for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { + pdevice = &pPP2->DeviceSettings[ii]; + ATTOFlags = le16_to_cpu(pdevice->ATTOFlags); + data = 0; + + /* Translate ATTO device flags to LSI format + */ + if (ATTOFlags & ATTOFLAG_DISC) + data |= (MPI_SCSIPORTPAGE2_DEVICE_DISCONNECT_ENABLE); + if (ATTOFlags & ATTOFLAG_ID_ENB) + data |= (MPI_SCSIPORTPAGE2_DEVICE_ID_SCAN_ENABLE); + if (ATTOFlags & ATTOFLAG_LUN_ENB) + data |= (MPI_SCSIPORTPAGE2_DEVICE_LUN_SCAN_ENABLE); + if (ATTOFlags & ATTOFLAG_TAGGED) + data |= (MPI_SCSIPORTPAGE2_DEVICE_TAG_QUEUE_ENABLE); + if (!(ATTOFlags & ATTOFLAG_WIDE_ENB)) + data |= (MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE); + + data = (data << 16) | (pdevice->Period << 8) | 10; + ioc->spi_data.nvram[ii] = data; + } } else { SCSIPortPage2_t *pPP2 = (SCSIPortPage2_t *) pbuf; MpiDeviceInfo_t *pdevice = NULL; diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index c537d71..dcf911a 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h @@ -601,6 +601,7 @@ typedef struct _MPT_ADAPTER u16 hs_reply[MPT_MAX_FRAME_SIZE/sizeof(u16)]; IOCFactsReply_t facts; PortFactsReply_t pfacts[2]; + int is_ATTO; FCPortPage0_t fc_port_page0[2]; struct timer_list persist_timer; /* persist table timer */ int persist_wait_done; /* persist completion flag */ diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index e4cc3dd..3dc6193 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c @@ -775,6 +775,7 @@ static struct pci_device_id mptspi_pci_t PCI_ANY_ID, PCI_ANY_ID }, { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035, PCI_ANY_ID, PCI_ANY_ID }, + { 0x117c, 0x0030, PCI_ANY_ID, PCI_ANY_ID }, /* ATTO UL4D */ {0} /* Terminating entry */ }; MODULE_DEVICE_TABLE(pci, mptspi_pci_table); Apparently ATTO devices have a completely different NVRAM format - maybe this causes the problem when a driver with just a PCI ID added tries to interpret NVRAM data using the LSI format?
Attachment:
pgpGGaWoqxcfh.pgp
Description: PGP signature