|
@@ -1977,42 +1977,62 @@ static int be_poll_tx_mcc(struct napi_struct *napi, int budget)
|
|
|
|
|
|
void be_detect_dump_ue(struct be_adapter *adapter)
|
|
|
{
|
|
|
- u32 ue_status_lo, ue_status_hi, ue_status_lo_mask, ue_status_hi_mask;
|
|
|
+ u32 ue_lo = 0, ue_hi = 0, ue_lo_mask = 0, ue_hi_mask = 0;
|
|
|
+ u32 sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
|
|
|
u32 i;
|
|
|
|
|
|
- pci_read_config_dword(adapter->pdev,
|
|
|
- PCICFG_UE_STATUS_LOW, &ue_status_lo);
|
|
|
- pci_read_config_dword(adapter->pdev,
|
|
|
- PCICFG_UE_STATUS_HIGH, &ue_status_hi);
|
|
|
- pci_read_config_dword(adapter->pdev,
|
|
|
- PCICFG_UE_STATUS_LOW_MASK, &ue_status_lo_mask);
|
|
|
- pci_read_config_dword(adapter->pdev,
|
|
|
- PCICFG_UE_STATUS_HI_MASK, &ue_status_hi_mask);
|
|
|
+ if (lancer_chip(adapter)) {
|
|
|
+ sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
|
|
|
+ if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
|
|
|
+ sliport_err1 = ioread32(adapter->db +
|
|
|
+ SLIPORT_ERROR1_OFFSET);
|
|
|
+ sliport_err2 = ioread32(adapter->db +
|
|
|
+ SLIPORT_ERROR2_OFFSET);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ pci_read_config_dword(adapter->pdev,
|
|
|
+ PCICFG_UE_STATUS_LOW, &ue_lo);
|
|
|
+ pci_read_config_dword(adapter->pdev,
|
|
|
+ PCICFG_UE_STATUS_HIGH, &ue_hi);
|
|
|
+ pci_read_config_dword(adapter->pdev,
|
|
|
+ PCICFG_UE_STATUS_LOW_MASK, &ue_lo_mask);
|
|
|
+ pci_read_config_dword(adapter->pdev,
|
|
|
+ PCICFG_UE_STATUS_HI_MASK, &ue_hi_mask);
|
|
|
|
|
|
- ue_status_lo = (ue_status_lo & (~ue_status_lo_mask));
|
|
|
- ue_status_hi = (ue_status_hi & (~ue_status_hi_mask));
|
|
|
+ ue_lo = (ue_lo & (~ue_lo_mask));
|
|
|
+ ue_hi = (ue_hi & (~ue_hi_mask));
|
|
|
+ }
|
|
|
|
|
|
- if (ue_status_lo || ue_status_hi) {
|
|
|
+ if (ue_lo || ue_hi ||
|
|
|
+ sliport_status & SLIPORT_STATUS_ERR_MASK) {
|
|
|
adapter->ue_detected = true;
|
|
|
adapter->eeh_err = true;
|
|
|
dev_err(&adapter->pdev->dev, "UE Detected!!\n");
|
|
|
}
|
|
|
|
|
|
- if (ue_status_lo) {
|
|
|
- for (i = 0; ue_status_lo; ue_status_lo >>= 1, i++) {
|
|
|
- if (ue_status_lo & 1)
|
|
|
+ if (ue_lo) {
|
|
|
+ for (i = 0; ue_lo; ue_lo >>= 1, i++) {
|
|
|
+ if (ue_lo & 1)
|
|
|
dev_err(&adapter->pdev->dev,
|
|
|
"UE: %s bit set\n", ue_status_low_desc[i]);
|
|
|
}
|
|
|
}
|
|
|
- if (ue_status_hi) {
|
|
|
- for (i = 0; ue_status_hi; ue_status_hi >>= 1, i++) {
|
|
|
- if (ue_status_hi & 1)
|
|
|
+ if (ue_hi) {
|
|
|
+ for (i = 0; ue_hi; ue_hi >>= 1, i++) {
|
|
|
+ if (ue_hi & 1)
|
|
|
dev_err(&adapter->pdev->dev,
|
|
|
"UE: %s bit set\n", ue_status_hi_desc[i]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
|
|
|
+ dev_err(&adapter->pdev->dev,
|
|
|
+ "sliport status 0x%x\n", sliport_status);
|
|
|
+ dev_err(&adapter->pdev->dev,
|
|
|
+ "sliport error1 0x%x\n", sliport_err1);
|
|
|
+ dev_err(&adapter->pdev->dev,
|
|
|
+ "sliport error2 0x%x\n", sliport_err2);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void be_worker(struct work_struct *work)
|
|
@@ -2022,7 +2042,7 @@ static void be_worker(struct work_struct *work)
|
|
|
struct be_rx_obj *rxo;
|
|
|
int i;
|
|
|
|
|
|
- if (!adapter->ue_detected && !lancer_chip(adapter))
|
|
|
+ if (!adapter->ue_detected)
|
|
|
be_detect_dump_ue(adapter);
|
|
|
|
|
|
/* when interrupts are not yet enabled, just reap any pending
|