39 #define EXACT_ADDR_FILTERS 8
41 static inline int macidx(
const struct cmac *
mac)
46 static void xaui_serdes_reset(
struct cmac *
mac)
48 static const unsigned int clear[] = {
57 t3_write_reg(adap, ctrl, adap->
params.vpd.xauicfg[macidx(mac)] |
61 t3_read_reg(adap, ctrl);
100 unsigned int oft = mac->
offset;
111 if (uses_xaui(adap)) {
112 if (adap->
params.rev == 0) {
118 "MAC %d XAUI SERDES CMU lock failed\n",
125 xaui_serdes_reset(mac);
135 else if (uses_xaui(adap))
150 static int t3b2_mac_reset(
struct cmac *mac)
154 int idx = macidx(mac);
183 0x80000000, 1, 1000, 2)) {
184 CH_ERR(adap,
"MAC %d Rx fifo drain failed\n",
195 else if (uses_xaui(adap))
230 static void set_addr_filter(
struct cmac *mac,
int idx,
const u8 *
addr)
232 u32 addr_lo, addr_hi;
233 unsigned int oft = mac->
offset + idx * 8;
235 addr_lo = (addr[3] << 24) | (addr[2] << 16) | (addr[1] << 8) | addr[0];
236 addr_hi = (addr[5] << 8) | addr[4];
247 set_addr_filter(mac, idx, addr);
270 t3_write_reg(mac->
adapter, reg, v);
281 t3_write_reg(mac->
adapter, reg, v);
287 static int hash_hw_addr(
const u8 * addr)
291 for (octet = 0; octet < 6; ++octet)
292 for (
c = addr[octet], bit = 0; bit < 8; c >>= 1, ++
bit) {
293 hash ^= (
c & 1) << i;
302 u32 val, hash_lo, hash_hi;
304 unsigned int oft = mac->
offset;
312 hash_lo = hash_hi = 0xffffffff;
315 int exact_addr_idx = mac->
nucast;
317 hash_lo = hash_hi = 0;
320 set_addr_filter(mac, exact_addr_idx++,
323 int hash = hash_hw_addr(ha->
addr);
326 hash_lo |= (1 <<
hash);
328 hash_hi |= (1 << (hash - 32));
337 static int rx_fifo_hwm(
int mtu)
349 unsigned int thres,
v,
reg;
375 if (t3_wait_op_done(adap, reg + mac->
offset,
395 hwm = rx_fifo_hwm(mtu);
407 thres = (adap->
params.vpd.cclk * 1000) / 15625;
408 thres = (thres * mtu) / 1000;
411 thres = mtu > thres ? (mtu - thres + 7) / 8 : 0;
412 thres =
max(thres, 8
U);
418 if (adap->
params.rev > 0) {
421 (hwm - lwm) * 4 / divisor);
432 unsigned int oft = mac->
offset;
455 u32 rx_max_pkt_size =
469 int idx = macidx(mac);
471 unsigned int oft = mac->
offset;
478 0xc4ffff01 : 0xc0ede401);
523 else if (uses_xaui(adap))
536 unsigned int tx_tcnt, tx_xcnt;
584 }
else if (status == 2) {
600 #define RMON_READ(mac, addr) t3_read_reg(mac->adapter, addr + mac->offset)
601 #define RMON_UPDATE(mac, name, reg) \
602 (mac)->stats.name += (u64)RMON_READ(mac, A_XGM_STAT_##reg)
603 #define RMON_UPDATE64(mac, name, reg_lo, reg_hi) \
604 (mac)->stats.name += RMON_READ(mac, A_XGM_STAT_##reg_lo) + \
605 ((u64)RMON_READ(mac, A_XGM_STAT_##reg_hi) << 32)
624 mac->
stats.rx_too_long +=
v;
653 lo = (
u32) mac->
stats.rx_cong_drops;
654 mac->
stats.rx_cong_drops += (
u64) (v - lo);