aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen/netxen_nic.h')
-rw-r--r--drivers/net/netxen/netxen_nic.h102
1 files changed, 86 insertions, 16 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index 91f25e0a638e..6ce93fcbed32 100644
--- a/drivers/net/netxen/netxen_nic.h
+++ b/drivers/net/netxen/netxen_nic.h
@@ -937,6 +937,7 @@ struct netxen_adapter {
937 struct netxen_ring_ctx *ctx_desc; 937 struct netxen_ring_ctx *ctx_desc;
938 struct pci_dev *ctx_desc_pdev; 938 struct pci_dev *ctx_desc_pdev;
939 dma_addr_t ctx_desc_phys_addr; 939 dma_addr_t ctx_desc_phys_addr;
940 int intr_scheme;
940 int (*enable_phy_interrupts) (struct netxen_adapter *); 941 int (*enable_phy_interrupts) (struct netxen_adapter *);
941 int (*disable_phy_interrupts) (struct netxen_adapter *); 942 int (*disable_phy_interrupts) (struct netxen_adapter *);
942 void (*handle_phy_intr) (struct netxen_adapter *); 943 void (*handle_phy_intr) (struct netxen_adapter *);
@@ -1080,37 +1081,106 @@ struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev);
1080 1081
1081static inline void netxen_nic_disable_int(struct netxen_adapter *adapter) 1082static inline void netxen_nic_disable_int(struct netxen_adapter *adapter)
1082{ 1083{
1083 /* 1084 uint32_t mask = 0x7ff;
1084 * ISR_INT_MASK: Can be read from window 0 or 1. 1085 int retries = 32;
1085 */ 1086
1086 writel(0x7ff, PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK)); 1087 DPRINTK(1, INFO, "Entered ISR Disable \n");
1088
1089 switch (adapter->portnum) {
1090 case 0:
1091 writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_0));
1092 break;
1093 case 1:
1094 writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_1));
1095 break;
1096 case 2:
1097 writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_2));
1098 break;
1099 case 3:
1100 writel(0x0, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_3));
1101 break;
1102 }
1103
1104 if (adapter->intr_scheme != -1 &&
1105 adapter->intr_scheme != INTR_SCHEME_PERPORT) {
1106 writel(mask,
1107 (void *)(PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK)));
1108 }
1109
1110 /* Window = 0 or 1 */
1111 if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
1112 do {
1113 writel(0xffffffff, (void *)
1114 (PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_TARGET_STATUS)));
1115 mask = readl((void *)
1116 (pci_base_offset(adapter, ISR_INT_VECTOR)));
1117 if (!(mask & 0x80))
1118 break;
1119 udelay(10);
1120 } while (--retries);
1121
1122 if (!retries) {
1123 printk(KERN_NOTICE "%s: Failed to disable interrupt completely\n",
1124 netxen_nic_driver_name);
1125 }
1126 }
1127
1128 DPRINTK(1, INFO, "Done with Disable Int\n");
1087 1129
1130 return;
1088} 1131}
1089 1132
1090static inline void netxen_nic_enable_int(struct netxen_adapter *adapter) 1133static inline void netxen_nic_enable_int(struct netxen_adapter *adapter)
1091{ 1134{
1092 u32 mask; 1135 u32 mask;
1093 1136
1094 switch (adapter->ahw.board_type) { 1137 DPRINTK(1, INFO, "Entered ISR Enable \n");
1095 case NETXEN_NIC_GBE: 1138
1096 mask = 0x77b; 1139 if (adapter->intr_scheme != -1 &&
1140 adapter->intr_scheme != INTR_SCHEME_PERPORT) {
1141 switch (adapter->ahw.board_type) {
1142 case NETXEN_NIC_GBE:
1143 mask = 0x77b;
1144 break;
1145 case NETXEN_NIC_XGBE:
1146 mask = 0x77f;
1147 break;
1148 default:
1149 mask = 0x7ff;
1150 break;
1151 }
1152
1153 writel(mask,
1154 (void *)(PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK)));
1155 }
1156 switch (adapter->portnum) {
1157 case 0:
1158 writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_0));
1097 break; 1159 break;
1098 case NETXEN_NIC_XGBE: 1160 case 1:
1099 mask = 0x77f; 1161 writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_1));
1100 break; 1162 break;
1101 default: 1163 case 2:
1102 mask = 0x7ff; 1164 writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_2));
1165 break;
1166 case 3:
1167 writel(0x1, NETXEN_CRB_NORMALIZE(adapter, CRB_SW_INT_MASK_3));
1103 break; 1168 break;
1104 } 1169 }
1105 1170
1106 writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_MASK));
1107
1108 if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { 1171 if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
1109 mask = 0xbff; 1172 mask = 0xbff;
1110 writel(0X0, NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); 1173 if (adapter->intr_scheme != -1 &&
1111 writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, 1174 adapter->intr_scheme != INTR_SCHEME_PERPORT) {
1112 ISR_INT_TARGET_MASK)); 1175 writel(0X0, NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR));
1176 }
1177 writel(mask,
1178 (void *)(PCI_OFFSET_SECOND_RANGE(adapter, ISR_INT_TARGET_MASK)));
1113 } 1179 }
1180
1181 DPRINTK(1, INFO, "Done with enable Int\n");
1182
1183 return;
1114} 1184}
1115 1185
1116/* 1186/*