Home | History | Annotate | Download | only in cxgb

Lines Matching refs:mac

49 static inline int macidx(const struct cmac *mac)
51 return mac->offset / (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR);
54 static void xaui_serdes_reset(struct cmac *mac)
62 adapter_t *adap = mac->adapter;
63 u32 ctrl = A_XGM_SERDES_CTRL0 + mac->offset;
65 t3_write_reg(adap, ctrl, adap->params.vpd.xauicfg[macidx(mac)] |
78 void t3b_pcs_reset(struct cmac *mac)
80 t3_set_reg_field(mac->adapter, A_XGM_RESET_CTRL + mac->offset,
83 t3_set_reg_field(mac->adapter, A_XGM_RESET_CTRL + mac->offset, 0,
87 int t3_mac_reset(struct cmac *mac)
107 adapter_t *adap = mac->adapter;
108 unsigned int oft = mac->offset;
125 "MAC %d XAUI SERDES CMU lock failed\n",
126 macidx(mac));
132 xaui_serdes_reset(mac);
136 if (mac->multiport) {
151 if (is_10G(adap) || mac->multiport)
161 t3b_pcs_reset(mac);
164 memset(&mac->stats, 0, sizeof(mac->stats));
168 static int t3b2_mac_reset(struct cmac *mac)
171 adapter_t *adap = mac->adapter;
172 unsigned int oft = mac->offset;
176 if (!macidx(mac))
190 CH_ERR(adap, "MAC %d Rx fifo drain failed\n",
191 macidx(mac));
195 t3_write_reg(adap, A_XGM_RESET_CTRL + oft, 0); /*MAC in reset*/
209 t3b_pcs_reset(mac);
216 if (!macidx(mac))
227 static void set_addr_filter(struct cmac *mac, int idx, const u8 *addr)
230 unsigned int oft = mac->offset + idx * 8;
235 t3_write_reg(mac->adapter, A_XGM_RX_EXACT_MATCH_LOW_1 + oft, addr_lo);
236 t3_write_reg(mac->adapter, A_XGM_RX_EXACT_MATCH_HIGH_1 + oft, addr_hi);
239 /* Set one of the station's unicast MAC addresses. */
240 int t3_mac_set_address(struct cmac *mac, unsigned int idx, u8 addr[6])
242 if (mac->multiport)
243 idx = mac->ext_port + idx * mac->adapter->params.nports;
244 if (idx >= mac->nucast)
246 set_addr_filter(mac, idx, addr);
247 if (mac->multiport && idx < mac->adapter->params.nports)
248 t3_vsc7323_set_addr(mac->adapter, addr, idx);
257 int t3_mac_set_num_ucast(struct cmac *mac, unsigned char n)
261 mac->nucast = n;
265 static void disable_exact_filters(struct cmac *mac)
267 unsigned int i, reg = mac->offset + A_XGM_RX_EXACT_MATCH_LOW_1;
270 u32 v = t3_read_reg(mac->adapter, reg);
271 t3_write_reg(mac->adapter, reg, v);
273 t3_read_reg(mac->adapter, A_XGM_RX_EXACT_MATCH_LOW_1); /* flush */
276 static void enable_exact_filters(struct cmac *mac)
278 unsigned int i, reg = mac->offset + A_XGM_RX_EXACT_MATCH_HIGH_1;
281 u32 v = t3_read_reg(mac->adapter, reg);
282 t3_write_reg(mac->adapter, reg, v);
284 t3_read_reg(mac->adapter, A_XGM_RX_EXACT_MATCH_LOW_1); /* flush */
301 int t3_mac_set_rx_mode(struct cmac *mac, struct t3_rx_mode *rm)
304 adapter_t *adap = mac->adapter;
305 unsigned int oft = mac->offset;
308 mac->promisc_map |= 1 << mac->ext_port;
310 mac->promisc_map &= ~(1 << mac->ext_port);
312 mac->promisc_map ? F_COPYALLFRAMES : 0);
314 if (allmulti_rx_mode(rm) || mac->multiport)
318 int exact_addr_idx = mac->nucast;
323 set_addr_filter(mac, exact_addr_idx++, addr);
347 int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu)
351 adapter_t *adap = mac->adapter;
358 if (mac->multiport)
362 if (mac->multiport)
363 return t3_vsc7323_set_mtu(adap, mtu - 4, mac->ext_port);
366 (t3_read_reg(adap, A_XGM_RX_CTRL + mac->offset) & F_RXEN)) {
367 disable_exact_filters(mac);
368 v = t3_read_reg(adap, A_XGM_RX_CFG + mac->offset);
369 t3_set_reg_field(adap, A_XGM_RX_CFG + mac->offset,
374 A_XGM_RX_MAX_PKT_SIZE_ERR_CNT + mac->offset,
376 t3_write_reg(adap, A_XGM_RX_CFG + mac->offset, v);
377 enable_exact_filters(mac);
380 t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, mtu);
381 t3_write_reg(adap, A_XGM_RX_CFG + mac->offset, v);
382 enable_exact_filters(mac);
384 t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, mtu);
392 v = t3_read_reg(adap, A_XGM_RXFIFO_CFG + mac->offset);
399 t3_write_reg(adap, A_XGM_RXFIFO_CFG + mac->offset, v);
408 t3_set_reg_field(adap, A_XGM_TXFIFO_CFG + mac->offset,
415 t3_write_reg(adap, A_XGM_PAUSE_TIMER + mac->offset,
417 t3_write_reg(adap, A_XGM_TX_PAUSE_QUANTA + mac->offset,
422 int t3_mac_set_speed_duplex_fc(struct cmac *mac, int speed, int duplex, int fc)
425 adapter_t *adap = mac->adapter;
426 unsigned int oft = mac->offset;
430 if (mac->multiport) {
439 return t3_vsc7323_set_speed_fc(adap, speed, fc, mac->ext_port);
469 int t3_mac_enable(struct cmac *mac, int which)
471 int idx = macidx(mac);
472 adapter_t *adap = mac->adapter;
473 unsigned int oft = mac->offset;
474 struct mac_stats *s = &mac->stats;
476 if (mac->multiport)
477 return t3_vsc7323_enable(adap, mac->ext_port, which);
488 mac->tx_mcnt = s->tx_frames;
489 mac->tx_tcnt = (G_TXDROPCNTCH0RCVD(t3_read_reg(adap,
491 mac->tx_xcnt = (G_TXSPI4SOPCNT(t3_read_reg(adap,
494 mac->rx_mcnt = s->rx_frames;
495 mac->rx_pause = s->rx_pause;
496 mac->rx_xcnt = (G_TXSPI4SOPCNT(t3_read_reg(adap,
499 mac->rx_ocnt = s->rx_fifo_ovfl;
500 mac->txen = F_TXEN;
501 mac->toggle_cnt = 0;
508 int t3_mac_disable(struct cmac *mac, int which)
510 adapter_t *adap = mac->adapter;
512 if (mac->multiport)
513 return t3_vsc7323_disable(adap, mac->ext_port, which);
516 t3_write_reg(adap, A_XGM_TX_CTRL + mac->offset, 0);
517 mac->txen = 0;
522 t3_set_reg_field(mac->adapter, A_XGM_RESET_CTRL + mac->offset,
525 t3_write_reg(adap, A_XGM_RX_CTRL + mac->offset, 0);
532 t3_write_reg(mac->adapter, A_XGM_RESET_CTRL + mac->offset, val);
537 int t3b2_mac_watchdog_task(struct cmac *mac)
541 adapter_t *adap = mac->adapter;
542 struct mac_stats *s = &mac->stats;
547 if (mac->multiport) {
556 tx_tcnt = mac->tx_tcnt; /* If tx_mcnt is progressing ignore tx_tcnt*/
558 if (tx_mcnt == mac->tx_mcnt && mac->rx_pause == s->rx_pause) {
561 mac->offset)));
564 A_TP_TX_DROP_CNT_CH0 + macidx(mac));
571 mac->toggle_cnt = 0;
575 if ((tx_tcnt != mac->tx_tcnt) && (mac->tx_xcnt == 0)) {
576 if (mac->toggle_cnt > 4) {
584 mac->toggle_cnt = 0;
589 if (rx_mcnt != mac->rx_mcnt) {
592 mac->offset))) +
593 (s->rx_fifo_ovfl - mac->rx_ocnt);
594 mac->rx_ocnt = s->rx_fifo_ovfl;
598 if (mac->rx_mcnt != s->rx_frames && rx_xcnt == 0 && mac->rx_xcnt == 0) {
599 if (!mac->multiport)
605 mac->tx_tcnt = tx_tcnt;
606 mac->tx_xcnt = tx_xcnt;
607 mac->tx_mcnt = s->tx_frames;
608 mac->rx_xcnt = rx_xcnt;
609 mac->rx_mcnt = s->rx_frames;
610 mac->rx_pause = s->rx_pause;
612 t3_write_reg(adap, A_XGM_TX_CTRL + mac->offset, 0);
613 t3_read_reg(adap, A_XGM_TX_CTRL + mac->offset); /* flush */
614 t3_write_reg(adap, A_XGM_TX_CTRL + mac->offset, mac->txen);
615 t3_read_reg(adap, A_XGM_TX_CTRL + mac->offset); /* flush */
616 mac->toggle_cnt++;
618 t3b2_mac_reset(mac);
619 mac->toggle_cnt = 0;
631 const struct mac_stats *t3_mac_update_stats(struct cmac *mac)
633 #define RMON_READ(mac, addr) t3_read_reg(mac->adapter, addr + mac->offset)
634 #define RMON_UPDATE(mac, name, reg) \
635 (mac)->stats.name += (u64)RMON_READ(mac, A_XGM_STAT_##reg)
636 #define RMON_UPDATE64(mac, name, reg_lo, reg_hi) \
637 (mac)->stats.name += RMON_READ(mac, A_XGM_STAT_##reg_lo) + \
638 ((u64)RMON_READ(mac, A_XGM_STAT_##reg_hi) << 32)
642 if (mac->multiport)
643 return t3_vsc7323_update_stats(mac);
645 RMON_UPDATE64(mac, rx_octets, RX_BYTES_LOW, RX_BYTES_HIGH);
646 RMON_UPDATE64(mac, rx_frames, RX_FRAMES_LOW, RX_FRAMES_HIGH);
647 RMON_UPDATE(mac, rx_mcast_frames, RX_MCAST_FRAMES);
648 RMON_UPDATE(mac, rx_bcast_frames, RX_BCAST_FRAMES);
649 RMON_UPDATE(mac, rx_fcs_errs, RX_CRC_ERR_FRAMES);
650 RMON_UPDATE(mac, rx_pause, RX_PAUSE_FRAMES);
651 RMON_UPDATE(mac, rx_jabber, RX_JABBER_FRAMES);
652 RMON_UPDATE(mac, rx_short, RX_SHORT_FRAMES);
653 RMON_UPDATE(mac, rx_symbol_errs, RX_SYM_CODE_ERR_FRAMES);
655 RMON_UPDATE(mac, rx_too_long, RX_OVERSIZE_FRAMES);
657 v = RMON_READ(mac, A_XGM_RX_MAX_PKT_SIZE_ERR_CNT);
658 if (mac->adapter->params.rev == T3_REV_B2)
660 mac->stats.rx_too_long += v;
662 RMON_UPDATE(mac, rx_frames_64, RX_64B_FRAMES);
663 RMON_UPDATE(mac, rx_frames_65_127, RX_65_127B_FRAMES);
664 RMON_UPDATE(mac, rx_frames_128_255, RX_128_255B_FRAMES);
665 RMON_UPDATE(mac, rx_frames_256_511, RX_256_511B_FRAMES);
666 RMON_UPDATE(mac, rx_frames_512_1023, RX_512_1023B_FRAMES);
667 RMON_UPDATE(mac, rx_frames_1024_1518, RX_1024_1518B_FRAMES);
668 RMON_UPDATE(mac, rx_frames_1519_max, RX_1519_MAXB_FRAMES);
670 RMON_UPDATE64(mac, tx_octets, TX_BYTE_LOW, TX_BYTE_HIGH);
671 RMON_UPDATE64(mac, tx_frames, TX_FRAME_LOW, TX_FRAME_HIGH);
672 RMON_UPDATE(mac, tx_mcast_frames, TX_MCAST);
673 RMON_UPDATE(mac, tx_bcast_frames, TX_BCAST);
674 RMON_UPDATE(mac, tx_pause, TX_PAUSE);
676 RMON_UPDATE(mac, tx_underrun, TX_ERR_FRAMES);
678 RMON_UPDATE(mac, tx_frames_64, TX_64B_FRAMES);
679 RMON_UPDATE(mac, tx_frames_65_127, TX_65_127B_FRAMES);
680 RMON_UPDATE(mac, tx_frames_128_255, TX_128_255B_FRAMES);
681 RMON_UPDATE(mac, tx_frames_256_511, TX_256_511B_FRAMES);
682 RMON_UPDATE(mac, tx_frames_512_1023, TX_512_1023B_FRAMES);
683 RMON_UPDATE(mac, tx_frames_1024_1518, TX_1024_1518B_FRAMES);
684 RMON_UPDATE(mac, tx_frames_1519_max, TX_1519_MAXB_FRAMES);
687 t3_write_reg(mac->adapter, A_TP_MIB_INDEX, mac->offset ? 51 : 50);
688 v = t3_read_reg(mac->adapter, A_TP_MIB_RDATA);
689 lo = (u32)mac->stats.rx_cong_drops;
690 mac->stats.rx_cong_drops += (u64)(v - lo);
692 return &mac->stats;