Lines Matching refs:lmac
110 void cgx_write(struct cgx *cgx, u64 lmac, u64 offset, u64 val) in cgx_write() argument
112 writeq(val, cgx->reg_base + (lmac << cgx->mac_ops->lmac_offset) + in cgx_write()
116 u64 cgx_read(struct cgx *cgx, u64 lmac, u64 offset) in cgx_read() argument
118 return readq(cgx->reg_base + (lmac << cgx->mac_ops->lmac_offset) + in cgx_read()
122 struct lmac *lmac_pdata(u8 lmac_id, struct cgx *cgx) in lmac_pdata()
208 struct lmac *lmac = lmac_pdata(lmac_id, cgxd); in cgx_get_link_info() local
210 if (!lmac) in cgx_get_link_info()
213 *linfo = lmac->link_info; in cgx_get_link_info()
238 struct lmac *lmac = lmac_pdata(lmac_id, cgx_dev); in cgx_lmac_addr_set() local
253 index = id * lmac->mac_to_index_bmap.max; in cgx_lmac_addr_set()
297 struct lmac *lmac = lmac_pdata(lmac_id, cgx_dev); in cgx_lmac_addr_add() local
303 if (!lmac) in cgx_lmac_addr_add()
308 idx = rvu_alloc_rsrc(&lmac->mac_to_index_bmap); in cgx_lmac_addr_add()
314 index = id * lmac->mac_to_index_bmap.max + idx; in cgx_lmac_addr_add()
327 lmac->mcast_filters_count++; in cgx_lmac_addr_add()
328 } else if (!lmac->mcast_filters_count) { in cgx_lmac_addr_add()
340 struct lmac *lmac = lmac_pdata(lmac_id, cgx_dev); in cgx_lmac_addr_reset() local
345 if (!lmac) in cgx_lmac_addr_reset()
352 set_bit(0, lmac->mac_to_index_bmap.bmap); in cgx_lmac_addr_reset()
356 index = id * lmac->mac_to_index_bmap.max + index; in cgx_lmac_addr_reset()
376 struct lmac *lmac; in cgx_lmac_addr_update() local
380 lmac = lmac_pdata(lmac_id, cgx_dev); in cgx_lmac_addr_update()
381 if (!lmac) in cgx_lmac_addr_update()
386 if (index >= lmac->mac_to_index_bmap.max) in cgx_lmac_addr_update()
390 if (!test_bit(index, lmac->mac_to_index_bmap.bmap)) in cgx_lmac_addr_update()
395 index = id * lmac->mac_to_index_bmap.max + index; in cgx_lmac_addr_update()
408 struct lmac *lmac = lmac_pdata(lmac_id, cgx_dev); in cgx_lmac_addr_del() local
414 if (!lmac) in cgx_lmac_addr_del()
419 if (index >= lmac->mac_to_index_bmap.max) in cgx_lmac_addr_del()
426 rvu_free_rsrc(&lmac->mac_to_index_bmap, index); in cgx_lmac_addr_del()
430 index = id * lmac->mac_to_index_bmap.max + index; in cgx_lmac_addr_del()
437 lmac->mcast_filters_count--; in cgx_lmac_addr_del()
439 if (!lmac->mcast_filters_count) { in cgx_lmac_addr_del()
454 struct lmac *lmac = lmac_pdata(lmac_id, cgx_dev); in cgx_lmac_addr_max_entries_get() local
456 if (lmac) in cgx_lmac_addr_max_entries_get()
457 return lmac->mac_to_index_bmap.max; in cgx_lmac_addr_max_entries_get()
465 struct lmac *lmac = lmac_pdata(lmac_id, cgx_dev); in cgx_lmac_addr_get() local
475 index = id * lmac->mac_to_index_bmap.max; in cgx_lmac_addr_get()
533 struct lmac *lmac = lmac_pdata(lmac_id, cgx); in cgx_lmac_promisc_config() local
534 u16 max_dmac = lmac->mac_to_index_bmap.max; in cgx_lmac_promisc_config()
866 int cgx_fwi_cmd_send(u64 req, u64 *resp, struct lmac *lmac) in cgx_fwi_cmd_send() argument
868 struct cgx *cgx = lmac->cgx; in cgx_fwi_cmd_send()
874 err = mutex_lock_interruptible(&lmac->cmd_lock); in cgx_fwi_cmd_send()
879 cmd = cgx_read(cgx, lmac->lmac_id, CGX_COMMAND_REG); in cgx_fwi_cmd_send()
889 lmac->cmd_pend = true; in cgx_fwi_cmd_send()
892 cgx_write(cgx, lmac->lmac_id, CGX_COMMAND_REG, req); in cgx_fwi_cmd_send()
895 if (!wait_event_timeout(lmac->wq_cmd_cmplt, !lmac->cmd_pend, in cgx_fwi_cmd_send()
899 cgx->cgx_id, lmac->lmac_id); in cgx_fwi_cmd_send()
906 *resp = lmac->resp; in cgx_fwi_cmd_send()
909 mutex_unlock(&lmac->cmd_lock); in cgx_fwi_cmd_send()
916 struct lmac *lmac; in cgx_fwi_cmd_generic() local
919 lmac = lmac_pdata(lmac_id, cgx); in cgx_fwi_cmd_generic()
920 if (!lmac) in cgx_fwi_cmd_generic()
923 err = cgx_fwi_cmd_send(req, resp, lmac); in cgx_fwi_cmd_generic()
1091 struct lmac *lmac) in cgx_link_change_handler() argument
1094 struct cgx *cgx = lmac->cgx; in cgx_link_change_handler()
1101 link_status_user_format(lstat, &event.link_uinfo, cgx, lmac->lmac_id); in cgx_link_change_handler()
1105 event.lmac_id = lmac->lmac_id; in cgx_link_change_handler()
1108 lmac->link_info = event.link_uinfo; in cgx_link_change_handler()
1109 linfo = &lmac->link_info; in cgx_link_change_handler()
1115 spin_lock(&lmac->event_cb_lock); in cgx_link_change_handler()
1117 if (!lmac->event_cb.notify_link_chg) { in cgx_link_change_handler()
1119 cgx->cgx_id, lmac->lmac_id); in cgx_link_change_handler()
1122 cgx->cgx_id, lmac->lmac_id, err_type); in cgx_link_change_handler()
1125 cgx->cgx_id, lmac->lmac_id, in cgx_link_change_handler()
1130 if (lmac->event_cb.notify_link_chg(&event, lmac->event_cb.data)) in cgx_link_change_handler()
1133 spin_unlock(&lmac->event_cb_lock); in cgx_link_change_handler()
1160 struct lmac *lmac = data; in cgx_fwi_event_handler() local
1163 cgx = lmac->cgx; in cgx_fwi_event_handler()
1169 event = cgx_read(cgx, lmac->lmac_id, CGX_EVENT_REG); in cgx_fwi_event_handler()
1179 lmac->resp = event; in cgx_fwi_event_handler()
1187 cgx_link_change_handler(event, lmac); in cgx_fwi_event_handler()
1190 lmac->cmd_pend = false; in cgx_fwi_event_handler()
1191 wake_up_interruptible(&lmac->wq_cmd_cmplt); in cgx_fwi_event_handler()
1195 cgx_link_change_handler(event, lmac); in cgx_fwi_event_handler()
1203 cgx_write(lmac->cgx, lmac->lmac_id, CGX_EVENT_REG, 0); in cgx_fwi_event_handler()
1204 cgx_write(lmac->cgx, lmac->lmac_id, offset, clear_bit); in cgx_fwi_event_handler()
1215 struct lmac *lmac; in cgx_lmac_evh_register() local
1217 lmac = lmac_pdata(lmac_id, cgx); in cgx_lmac_evh_register()
1218 if (!lmac) in cgx_lmac_evh_register()
1221 lmac->event_cb = *cb; in cgx_lmac_evh_register()
1228 struct lmac *lmac; in cgx_lmac_evh_unregister() local
1232 lmac = lmac_pdata(lmac_id, cgx); in cgx_lmac_evh_unregister()
1233 if (!lmac) in cgx_lmac_evh_unregister()
1236 spin_lock_irqsave(&lmac->event_cb_lock, flags); in cgx_lmac_evh_unregister()
1237 lmac->event_cb.notify_link_chg = NULL; in cgx_lmac_evh_unregister()
1238 lmac->event_cb.data = NULL; in cgx_lmac_evh_unregister()
1239 spin_unlock_irqrestore(&lmac->event_cb_lock, flags); in cgx_lmac_evh_unregister()
1402 static int cgx_configure_interrupt(struct cgx *cgx, struct lmac *lmac, in cgx_configure_interrupt() argument
1416 free_irq(irq, lmac); in cgx_configure_interrupt()
1420 err = request_irq(irq, cgx_fwi_event_handler, 0, lmac->name, lmac); in cgx_configure_interrupt()
1425 cgx_write(cgx, lmac->lmac_id, offset, ena_bit); in cgx_configure_interrupt()
1452 struct lmac *lmac; in cgx_lmac_init() local
1469 lmac = kzalloc(sizeof(struct lmac), GFP_KERNEL); in cgx_lmac_init()
1470 if (!lmac) in cgx_lmac_init()
1472 lmac->name = kcalloc(1, sizeof("cgx_fwi_xxx_yyy"), GFP_KERNEL); in cgx_lmac_init()
1473 if (!lmac->name) { in cgx_lmac_init()
1477 sprintf(lmac->name, "cgx_fwi_%d_%d", cgx->cgx_id, i); in cgx_lmac_init()
1479 lmac->lmac_id = __ffs64(lmac_list); in cgx_lmac_init()
1480 lmac_list &= ~BIT_ULL(lmac->lmac_id); in cgx_lmac_init()
1482 lmac->lmac_id = i; in cgx_lmac_init()
1485 lmac->cgx = cgx; in cgx_lmac_init()
1486 lmac->mac_to_index_bmap.max = in cgx_lmac_init()
1488 err = rvu_alloc_bitmap(&lmac->mac_to_index_bmap); in cgx_lmac_init()
1493 set_bit(0, lmac->mac_to_index_bmap.bmap); in cgx_lmac_init()
1495 init_waitqueue_head(&lmac->wq_cmd_cmplt); in cgx_lmac_init()
1496 mutex_init(&lmac->cmd_lock); in cgx_lmac_init()
1497 spin_lock_init(&lmac->event_cb_lock); in cgx_lmac_init()
1498 err = cgx_configure_interrupt(cgx, lmac, lmac->lmac_id, false); in cgx_lmac_init()
1503 cgx->lmac_idmap[lmac->lmac_id] = lmac; in cgx_lmac_init()
1504 set_bit(lmac->lmac_id, &cgx->lmac_bmap); in cgx_lmac_init()
1505 cgx->mac_ops->mac_pause_frm_config(cgx, lmac->lmac_id, true); in cgx_lmac_init()
1511 rvu_free_bitmap(&lmac->mac_to_index_bmap); in cgx_lmac_init()
1513 kfree(lmac->name); in cgx_lmac_init()
1515 kfree(lmac); in cgx_lmac_init()
1521 struct lmac *lmac; in cgx_lmac_exit() local
1532 lmac = cgx->lmac_idmap[i]; in cgx_lmac_exit()
1533 if (!lmac) in cgx_lmac_exit()
1535 cgx->mac_ops->mac_pause_frm_config(cgx, lmac->lmac_id, false); in cgx_lmac_exit()
1536 cgx_configure_interrupt(cgx, lmac, lmac->lmac_id, true); in cgx_lmac_exit()
1537 kfree(lmac->mac_to_index_bmap.bmap); in cgx_lmac_exit()
1538 kfree(lmac->name); in cgx_lmac_exit()
1539 kfree(lmac); in cgx_lmac_exit()