[SCSI] mptsas: support link error attributes
.. and the fusion part. I had to move around the debug functions around a little bit so they are below the transport class methods. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
committed by
James Bottomley
parent
28f22b031f
commit
b514112802
@@ -123,6 +123,101 @@ struct mptsas_portinfo {
|
|||||||
struct mptsas_phyinfo *phy_info;
|
struct mptsas_phyinfo *phy_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SASDEBUG
|
||||||
|
static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
|
||||||
|
{
|
||||||
|
printk("---- IO UNIT PAGE 0 ------------\n");
|
||||||
|
printk("Handle=0x%X\n",
|
||||||
|
le16_to_cpu(phy_data->AttachedDeviceHandle));
|
||||||
|
printk("Controller Handle=0x%X\n",
|
||||||
|
le16_to_cpu(phy_data->ControllerDevHandle));
|
||||||
|
printk("Port=0x%X\n", phy_data->Port);
|
||||||
|
printk("Port Flags=0x%X\n", phy_data->PortFlags);
|
||||||
|
printk("PHY Flags=0x%X\n", phy_data->PhyFlags);
|
||||||
|
printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate);
|
||||||
|
printk("Controller PHY Device Info=0x%X\n",
|
||||||
|
le32_to_cpu(phy_data->ControllerPhyDeviceInfo));
|
||||||
|
printk("DiscoveryStatus=0x%X\n",
|
||||||
|
le32_to_cpu(phy_data->DiscoveryStatus));
|
||||||
|
printk("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0)
|
||||||
|
{
|
||||||
|
__le64 sas_address;
|
||||||
|
|
||||||
|
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
||||||
|
|
||||||
|
printk("---- SAS PHY PAGE 0 ------------\n");
|
||||||
|
printk("Attached Device Handle=0x%X\n",
|
||||||
|
le16_to_cpu(pg0->AttachedDevHandle));
|
||||||
|
printk("SAS Address=0x%llX\n",
|
||||||
|
(unsigned long long)le64_to_cpu(sas_address));
|
||||||
|
printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier);
|
||||||
|
printk("Attached Device Info=0x%X\n",
|
||||||
|
le32_to_cpu(pg0->AttachedDeviceInfo));
|
||||||
|
printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate);
|
||||||
|
printk("Change Count=0x%X\n", pg0->ChangeCount);
|
||||||
|
printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo));
|
||||||
|
printk("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1)
|
||||||
|
{
|
||||||
|
printk("---- SAS PHY PAGE 1 ------------\n");
|
||||||
|
printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount);
|
||||||
|
printk("Running Disparity Error Count=0x%x\n",
|
||||||
|
pg1->RunningDisparityErrorCount);
|
||||||
|
printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount);
|
||||||
|
printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount);
|
||||||
|
printk("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mptsas_print_device_pg0(SasDevicePage0_t *pg0)
|
||||||
|
{
|
||||||
|
__le64 sas_address;
|
||||||
|
|
||||||
|
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
||||||
|
|
||||||
|
printk("---- SAS DEVICE PAGE 0 ---------\n");
|
||||||
|
printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle));
|
||||||
|
printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle));
|
||||||
|
printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot));
|
||||||
|
printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address));
|
||||||
|
printk("Target ID=0x%X\n", pg0->TargetID);
|
||||||
|
printk("Bus=0x%X\n", pg0->Bus);
|
||||||
|
printk("PhyNum=0x%X\n", pg0->PhyNum);
|
||||||
|
printk("AccessStatus=0x%X\n", le16_to_cpu(pg0->AccessStatus));
|
||||||
|
printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo));
|
||||||
|
printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags));
|
||||||
|
printk("Physical Port=0x%X\n", pg0->PhysicalPort);
|
||||||
|
printk("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
|
||||||
|
{
|
||||||
|
printk("---- SAS EXPANDER PAGE 1 ------------\n");
|
||||||
|
|
||||||
|
printk("Physical Port=0x%X\n", pg1->PhysicalPort);
|
||||||
|
printk("PHY Identifier=0x%X\n", pg1->Phy);
|
||||||
|
printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate);
|
||||||
|
printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate);
|
||||||
|
printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate);
|
||||||
|
printk("Owner Device Handle=0x%X\n",
|
||||||
|
le16_to_cpu(pg1->OwnerDevHandle));
|
||||||
|
printk("Attached Device Handle=0x%X\n",
|
||||||
|
le16_to_cpu(pg1->AttachedDevHandle));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define mptsas_print_phy_data(phy_data) do { } while (0)
|
||||||
|
#define mptsas_print_phy_pg0(pg0) do { } while (0)
|
||||||
|
#define mptsas_print_phy_pg1(pg1) do { } while (0)
|
||||||
|
#define mptsas_print_device_pg0(pg0) do { } while (0)
|
||||||
|
#define mptsas_print_expander_pg1(pg1) do { } while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is pretty ugly. We will be able to seriously clean it up
|
* This is pretty ugly. We will be able to seriously clean it up
|
||||||
* once the DV code in mptscsih goes away and we can properly
|
* once the DV code in mptscsih goes away and we can properly
|
||||||
@@ -200,92 +295,77 @@ static struct scsi_host_template mptsas_driver_template = {
|
|||||||
.use_clustering = ENABLE_CLUSTERING,
|
.use_clustering = ENABLE_CLUSTERING,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
|
||||||
|
{
|
||||||
|
struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
|
||||||
|
return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mptsas_get_linkerrors(struct sas_phy *phy)
|
||||||
|
{
|
||||||
|
MPT_ADAPTER *ioc = phy_to_ioc(phy);
|
||||||
|
ConfigExtendedPageHeader_t hdr;
|
||||||
|
CONFIGPARMS cfg;
|
||||||
|
SasPhyPage1_t *buffer;
|
||||||
|
dma_addr_t dma_handle;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
|
||||||
|
hdr.ExtPageLength = 0;
|
||||||
|
hdr.PageNumber = 1 /* page number 1*/;
|
||||||
|
hdr.Reserved1 = 0;
|
||||||
|
hdr.Reserved2 = 0;
|
||||||
|
hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
|
||||||
|
hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
|
||||||
|
|
||||||
|
cfg.cfghdr.ehdr = &hdr;
|
||||||
|
cfg.physAddr = -1;
|
||||||
|
cfg.pageAddr = phy->identify.phy_identifier;
|
||||||
|
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||||
|
cfg.dir = 0; /* read */
|
||||||
|
cfg.timeout = 10;
|
||||||
|
|
||||||
|
error = mpt_config(ioc, &cfg);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
if (!hdr.ExtPageLength)
|
||||||
|
return -ENXIO;
|
||||||
|
|
||||||
|
buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
|
||||||
|
&dma_handle);
|
||||||
|
if (!buffer)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
cfg.physAddr = dma_handle;
|
||||||
|
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||||
|
|
||||||
|
error = mpt_config(ioc, &cfg);
|
||||||
|
if (error)
|
||||||
|
goto out_free_consistent;
|
||||||
|
|
||||||
|
mptsas_print_phy_pg1(buffer);
|
||||||
|
|
||||||
|
phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
|
||||||
|
phy->running_disparity_error_count =
|
||||||
|
le32_to_cpu(buffer->RunningDisparityErrorCount);
|
||||||
|
phy->loss_of_dword_sync_count =
|
||||||
|
le32_to_cpu(buffer->LossDwordSynchCount);
|
||||||
|
phy->phy_reset_problem_count =
|
||||||
|
le32_to_cpu(buffer->PhyResetProblemCount);
|
||||||
|
|
||||||
|
out_free_consistent:
|
||||||
|
pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
|
||||||
|
buffer, dma_handle);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct sas_function_template mptsas_transport_functions = {
|
static struct sas_function_template mptsas_transport_functions = {
|
||||||
|
.get_linkerrors = mptsas_get_linkerrors,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct scsi_transport_template *mptsas_transport_template;
|
static struct scsi_transport_template *mptsas_transport_template;
|
||||||
|
|
||||||
#ifdef SASDEBUG
|
|
||||||
static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
|
|
||||||
{
|
|
||||||
printk("---- IO UNIT PAGE 0 ------------\n");
|
|
||||||
printk("Handle=0x%X\n",
|
|
||||||
le16_to_cpu(phy_data->AttachedDeviceHandle));
|
|
||||||
printk("Controller Handle=0x%X\n",
|
|
||||||
le16_to_cpu(phy_data->ControllerDevHandle));
|
|
||||||
printk("Port=0x%X\n", phy_data->Port);
|
|
||||||
printk("Port Flags=0x%X\n", phy_data->PortFlags);
|
|
||||||
printk("PHY Flags=0x%X\n", phy_data->PhyFlags);
|
|
||||||
printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate);
|
|
||||||
printk("Controller PHY Device Info=0x%X\n",
|
|
||||||
le32_to_cpu(phy_data->ControllerPhyDeviceInfo));
|
|
||||||
printk("DiscoveryStatus=0x%X\n",
|
|
||||||
le32_to_cpu(phy_data->DiscoveryStatus));
|
|
||||||
printk("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0)
|
|
||||||
{
|
|
||||||
__le64 sas_address;
|
|
||||||
|
|
||||||
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
|
||||||
|
|
||||||
printk("---- SAS PHY PAGE 0 ------------\n");
|
|
||||||
printk("Attached Device Handle=0x%X\n",
|
|
||||||
le16_to_cpu(pg0->AttachedDevHandle));
|
|
||||||
printk("SAS Address=0x%llX\n",
|
|
||||||
(unsigned long long)le64_to_cpu(sas_address));
|
|
||||||
printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier);
|
|
||||||
printk("Attached Device Info=0x%X\n",
|
|
||||||
le32_to_cpu(pg0->AttachedDeviceInfo));
|
|
||||||
printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate);
|
|
||||||
printk("Change Count=0x%X\n", pg0->ChangeCount);
|
|
||||||
printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo));
|
|
||||||
printk("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mptsas_print_device_pg0(SasDevicePage0_t *pg0)
|
|
||||||
{
|
|
||||||
__le64 sas_address;
|
|
||||||
|
|
||||||
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
|
||||||
|
|
||||||
printk("---- SAS DEVICE PAGE 0 ---------\n");
|
|
||||||
printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle));
|
|
||||||
printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle));
|
|
||||||
printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot));
|
|
||||||
printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address));
|
|
||||||
printk("Target ID=0x%X\n", pg0->TargetID);
|
|
||||||
printk("Bus=0x%X\n", pg0->Bus);
|
|
||||||
printk("Parent Phy Num=0x%X\n", pg0->PhyNum);
|
|
||||||
printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus));
|
|
||||||
printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo));
|
|
||||||
printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags));
|
|
||||||
printk("Physical Port=0x%X\n", pg0->PhysicalPort);
|
|
||||||
printk("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
|
|
||||||
{
|
|
||||||
printk("---- SAS EXPANDER PAGE 1 ------------\n");
|
|
||||||
|
|
||||||
printk("Physical Port=0x%X\n", pg1->PhysicalPort);
|
|
||||||
printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier);
|
|
||||||
printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate);
|
|
||||||
printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate);
|
|
||||||
printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate);
|
|
||||||
printk("Owner Device Handle=0x%X\n",
|
|
||||||
le16_to_cpu(pg1->OwnerDevHandle));
|
|
||||||
printk("Attached Device Handle=0x%X\n",
|
|
||||||
le16_to_cpu(pg1->AttachedDevHandle));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define mptsas_print_phy_data(phy_data) do { } while (0)
|
|
||||||
#define mptsas_print_phy_pg0(pg0) do { } while (0)
|
|
||||||
#define mptsas_print_device_pg0(pg0) do { } while (0)
|
|
||||||
#define mptsas_print_expander_pg1(pg1) do { } while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user