diff options
Diffstat (limited to 'drivers/net/chelsio/ixf1010.c')
-rw-r--r-- | drivers/net/chelsio/ixf1010.c | 100 |
1 files changed, 60 insertions, 40 deletions
diff --git a/drivers/net/chelsio/ixf1010.c b/drivers/net/chelsio/ixf1010.c index 5b8f144e83d4..10b2a9a19006 100644 --- a/drivers/net/chelsio/ixf1010.c +++ b/drivers/net/chelsio/ixf1010.c | |||
@@ -145,48 +145,61 @@ static void disable_port(struct cmac *mac) | |||
145 | t1_tpi_write(mac->adapter, REG_PORT_ENABLE, val); | 145 | t1_tpi_write(mac->adapter, REG_PORT_ENABLE, val); |
146 | } | 146 | } |
147 | 147 | ||
148 | #define RMON_UPDATE(mac, name, stat_name) \ | ||
149 | t1_tpi_read((mac)->adapter, MACREG(mac, REG_##name), &val); \ | ||
150 | (mac)->stats.stat_name += val; | ||
151 | |||
152 | /* | 148 | /* |
153 | * Read the current values of the RMON counters and add them to the cumulative | 149 | * Read the current values of the RMON counters and add them to the cumulative |
154 | * port statistics. The HW RMON counters are cleared by this operation. | 150 | * port statistics. The HW RMON counters are cleared by this operation. |
155 | */ | 151 | */ |
156 | static void port_stats_update(struct cmac *mac) | 152 | static void port_stats_update(struct cmac *mac) |
157 | { | 153 | { |
158 | u32 val; | 154 | static struct { |
155 | unsigned int reg; | ||
156 | unsigned int offset; | ||
157 | } hw_stats[] = { | ||
158 | |||
159 | #define HW_STAT(name, stat_name) \ | ||
160 | { REG_##name, \ | ||
161 | (&((struct cmac_statistics *)NULL)->stat_name) - (u64 *)NULL } | ||
162 | |||
163 | /* Rx stats */ | ||
164 | HW_STAT(RxOctetsTotalOK, RxOctetsOK), | ||
165 | HW_STAT(RxOctetsBad, RxOctetsBad), | ||
166 | HW_STAT(RxUCPkts, RxUnicastFramesOK), | ||
167 | HW_STAT(RxMCPkts, RxMulticastFramesOK), | ||
168 | HW_STAT(RxBCPkts, RxBroadcastFramesOK), | ||
169 | HW_STAT(RxJumboPkts, RxJumboFramesOK), | ||
170 | HW_STAT(RxFCSErrors, RxFCSErrors), | ||
171 | HW_STAT(RxAlignErrors, RxAlignErrors), | ||
172 | HW_STAT(RxLongErrors, RxFrameTooLongErrors), | ||
173 | HW_STAT(RxVeryLongErrors, RxFrameTooLongErrors), | ||
174 | HW_STAT(RxPauseMacControlCounter, RxPauseFrames), | ||
175 | HW_STAT(RxDataErrors, RxDataErrors), | ||
176 | HW_STAT(RxJabberErrors, RxJabberErrors), | ||
177 | HW_STAT(RxRuntErrors, RxRuntErrors), | ||
178 | HW_STAT(RxShortErrors, RxRuntErrors), | ||
179 | HW_STAT(RxSequenceErrors, RxSequenceErrors), | ||
180 | HW_STAT(RxSymbolErrors, RxSymbolErrors), | ||
181 | |||
182 | /* Tx stats (skip collision stats as we are full-duplex only) */ | ||
183 | HW_STAT(TxOctetsTotalOK, TxOctetsOK), | ||
184 | HW_STAT(TxOctetsBad, TxOctetsBad), | ||
185 | HW_STAT(TxUCPkts, TxUnicastFramesOK), | ||
186 | HW_STAT(TxMCPkts, TxMulticastFramesOK), | ||
187 | HW_STAT(TxBCPkts, TxBroadcastFramesOK), | ||
188 | HW_STAT(TxJumboPkts, TxJumboFramesOK), | ||
189 | HW_STAT(TxPauseFrames, TxPauseFrames), | ||
190 | HW_STAT(TxExcessiveLengthDrop, TxLengthErrors), | ||
191 | HW_STAT(TxUnderrun, TxUnderrun), | ||
192 | HW_STAT(TxCRCErrors, TxFCSErrors) | ||
193 | }, *p = hw_stats; | ||
194 | u64 *stats = (u64 *) &mac->stats; | ||
195 | unsigned int i; | ||
196 | |||
197 | for (i = 0; i < ARRAY_SIZE(hw_stats); i++) { | ||
198 | u32 val; | ||
159 | 199 | ||
160 | /* Rx stats */ | 200 | t1_tpi_read(mac->adapter, MACREG(mac, p->reg), &val); |
161 | RMON_UPDATE(mac, RxOctetsTotalOK, RxOctetsOK); | 201 | stats[p->offset] += val; |
162 | RMON_UPDATE(mac, RxOctetsBad, RxOctetsBad); | 202 | } |
163 | RMON_UPDATE(mac, RxUCPkts, RxUnicastFramesOK); | ||
164 | RMON_UPDATE(mac, RxMCPkts, RxMulticastFramesOK); | ||
165 | RMON_UPDATE(mac, RxBCPkts, RxBroadcastFramesOK); | ||
166 | RMON_UPDATE(mac, RxJumboPkts, RxJumboFramesOK); | ||
167 | RMON_UPDATE(mac, RxFCSErrors, RxFCSErrors); | ||
168 | RMON_UPDATE(mac, RxAlignErrors, RxAlignErrors); | ||
169 | RMON_UPDATE(mac, RxLongErrors, RxFrameTooLongErrors); | ||
170 | RMON_UPDATE(mac, RxVeryLongErrors, RxFrameTooLongErrors); | ||
171 | RMON_UPDATE(mac, RxPauseMacControlCounter, RxPauseFrames); | ||
172 | RMON_UPDATE(mac, RxDataErrors, RxDataErrors); | ||
173 | RMON_UPDATE(mac, RxJabberErrors, RxJabberErrors); | ||
174 | RMON_UPDATE(mac, RxRuntErrors, RxRuntErrors); | ||
175 | RMON_UPDATE(mac, RxShortErrors, RxRuntErrors); | ||
176 | RMON_UPDATE(mac, RxSequenceErrors, RxSequenceErrors); | ||
177 | RMON_UPDATE(mac, RxSymbolErrors, RxSymbolErrors); | ||
178 | |||
179 | /* Tx stats (skip collision stats as we are full-duplex only) */ | ||
180 | RMON_UPDATE(mac, TxOctetsTotalOK, TxOctetsOK); | ||
181 | RMON_UPDATE(mac, TxOctetsBad, TxOctetsBad); | ||
182 | RMON_UPDATE(mac, TxUCPkts, TxUnicastFramesOK); | ||
183 | RMON_UPDATE(mac, TxMCPkts, TxMulticastFramesOK); | ||
184 | RMON_UPDATE(mac, TxBCPkts, TxBroadcastFramesOK); | ||
185 | RMON_UPDATE(mac, TxJumboPkts, TxJumboFramesOK); | ||
186 | RMON_UPDATE(mac, TxPauseFrames, TxPauseFrames); | ||
187 | RMON_UPDATE(mac, TxExcessiveLengthDrop, TxLengthErrors); | ||
188 | RMON_UPDATE(mac, TxUnderrun, TxUnderrun); | ||
189 | RMON_UPDATE(mac, TxCRCErrors, TxFCSErrors); | ||
190 | } | 203 | } |
191 | 204 | ||
192 | /* No-op interrupt operation as this MAC does not support interrupts */ | 205 | /* No-op interrupt operation as this MAC does not support interrupts */ |
@@ -273,7 +286,8 @@ static int mac_set_rx_mode(struct cmac *mac, struct t1_rx_mode *rm) | |||
273 | static int mac_set_mtu(struct cmac *mac, int mtu) | 286 | static int mac_set_mtu(struct cmac *mac, int mtu) |
274 | { | 287 | { |
275 | /* MAX_FRAME_SIZE inludes header + FCS, mtu doesn't */ | 288 | /* MAX_FRAME_SIZE inludes header + FCS, mtu doesn't */ |
276 | if (mtu > (MAX_FRAME_SIZE - 14 - 4)) return -EINVAL; | 289 | if (mtu > (MAX_FRAME_SIZE - 14 - 4)) |
290 | return -EINVAL; | ||
277 | t1_tpi_write(mac->adapter, MACREG(mac, REG_MAX_FRAME_SIZE), | 291 | t1_tpi_write(mac->adapter, MACREG(mac, REG_MAX_FRAME_SIZE), |
278 | mtu + 14 + 4); | 292 | mtu + 14 + 4); |
279 | return 0; | 293 | return 0; |
@@ -357,8 +371,8 @@ static void enable_port(struct cmac *mac) | |||
357 | val |= (1 << index); | 371 | val |= (1 << index); |
358 | t1_tpi_write(adapter, REG_PORT_ENABLE, val); | 372 | t1_tpi_write(adapter, REG_PORT_ENABLE, val); |
359 | 373 | ||
360 | index <<= 2; | 374 | index <<= 2; |
361 | if (is_T2(adapter)) { | 375 | if (is_T2(adapter)) { |
362 | /* T204: set the Fifo water level & threshold */ | 376 | /* T204: set the Fifo water level & threshold */ |
363 | t1_tpi_write(adapter, RX_FIFO_HIGH_WATERMARK_BASE + index, 0x740); | 377 | t1_tpi_write(adapter, RX_FIFO_HIGH_WATERMARK_BASE + index, 0x740); |
364 | t1_tpi_write(adapter, RX_FIFO_LOW_WATERMARK_BASE + index, 0x730); | 378 | t1_tpi_write(adapter, RX_FIFO_LOW_WATERMARK_BASE + index, 0x730); |
@@ -389,6 +403,10 @@ static int mac_disable(struct cmac *mac, int which) | |||
389 | return 0; | 403 | return 0; |
390 | } | 404 | } |
391 | 405 | ||
406 | #define RMON_UPDATE(mac, name, stat_name) \ | ||
407 | t1_tpi_read((mac)->adapter, MACREG(mac, REG_##name), &val); \ | ||
408 | (mac)->stats.stat_name += val; | ||
409 | |||
392 | /* | 410 | /* |
393 | * This function is called periodically to accumulate the current values of the | 411 | * This function is called periodically to accumulate the current values of the |
394 | * RMON counters into the port statistics. Since the counters are only 32 bits | 412 | * RMON counters into the port statistics. Since the counters are only 32 bits |
@@ -460,10 +478,12 @@ static struct cmac *ixf1010_mac_create(adapter_t *adapter, int index) | |||
460 | struct cmac *mac; | 478 | struct cmac *mac; |
461 | u32 val; | 479 | u32 val; |
462 | 480 | ||
463 | if (index > 9) return NULL; | 481 | if (index > 9) |
482 | return NULL; | ||
464 | 483 | ||
465 | mac = kzalloc(sizeof(*mac) + sizeof(cmac_instance), GFP_KERNEL); | 484 | mac = kzalloc(sizeof(*mac) + sizeof(cmac_instance), GFP_KERNEL); |
466 | if (!mac) return NULL; | 485 | if (!mac) |
486 | return NULL; | ||
467 | 487 | ||
468 | mac->ops = &ixf1010_ops; | 488 | mac->ops = &ixf1010_ops; |
469 | mac->instance = (cmac_instance *)(mac + 1); | 489 | mac->instance = (cmac_instance *)(mac + 1); |