Lines Matching refs:lmac

41 struct lmac {  struct
59 struct lmac *lmac_idmap[MAX_LMAC_PER_CGX]; argument
84 static void cgx_write(struct cgx *cgx, u64 lmac, u64 offset, u64 val) in cgx_write() argument
86 writeq(val, cgx->reg_base + (lmac << 18) + offset); in cgx_write()
89 static u64 cgx_read(struct cgx *cgx, u64 lmac, u64 offset) in cgx_read() argument
91 return readq(cgx->reg_base + (lmac << 18) + offset); in cgx_read()
94 static inline struct lmac *lmac_pdata(u8 lmac_id, struct cgx *cgx) in lmac_pdata()
156 struct lmac *lmac = lmac_pdata(lmac_id, cgxd); in cgx_get_link_info() local
158 if (!lmac) in cgx_get_link_info()
161 *linfo = lmac->link_info; in cgx_get_link_info()
501 static int cgx_fwi_cmd_send(u64 req, u64 *resp, struct lmac *lmac) in cgx_fwi_cmd_send() argument
503 struct cgx *cgx = lmac->cgx; in cgx_fwi_cmd_send()
509 err = mutex_lock_interruptible(&lmac->cmd_lock); in cgx_fwi_cmd_send()
514 cmd = cgx_read(cgx, lmac->lmac_id, CGX_COMMAND_REG); in cgx_fwi_cmd_send()
524 lmac->cmd_pend = true; in cgx_fwi_cmd_send()
527 cgx_write(cgx, lmac->lmac_id, CGX_COMMAND_REG, req); in cgx_fwi_cmd_send()
530 if (!wait_event_timeout(lmac->wq_cmd_cmplt, !lmac->cmd_pend, in cgx_fwi_cmd_send()
534 cgx->cgx_id, lmac->lmac_id); in cgx_fwi_cmd_send()
541 *resp = lmac->resp; in cgx_fwi_cmd_send()
544 mutex_unlock(&lmac->cmd_lock); in cgx_fwi_cmd_send()
552 struct lmac *lmac; in cgx_fwi_cmd_generic() local
555 lmac = lmac_pdata(lmac_id, cgx); in cgx_fwi_cmd_generic()
556 if (!lmac) in cgx_fwi_cmd_generic()
559 err = cgx_fwi_cmd_send(req, resp, lmac); in cgx_fwi_cmd_generic()
615 struct lmac *lmac) in cgx_link_change_handler() argument
618 struct cgx *cgx = lmac->cgx; in cgx_link_change_handler()
625 link_status_user_format(lstat, &event.link_uinfo, cgx, lmac->lmac_id); in cgx_link_change_handler()
629 event.lmac_id = lmac->lmac_id; in cgx_link_change_handler()
632 lmac->link_info = event.link_uinfo; in cgx_link_change_handler()
633 linfo = &lmac->link_info; in cgx_link_change_handler()
636 spin_lock(&lmac->event_cb_lock); in cgx_link_change_handler()
638 if (!lmac->event_cb.notify_link_chg) { in cgx_link_change_handler()
640 cgx->cgx_id, lmac->lmac_id); in cgx_link_change_handler()
643 cgx->cgx_id, lmac->lmac_id, err_type); in cgx_link_change_handler()
646 cgx->cgx_id, lmac->lmac_id, in cgx_link_change_handler()
651 if (lmac->event_cb.notify_link_chg(&event, lmac->event_cb.data)) in cgx_link_change_handler()
654 spin_unlock(&lmac->event_cb_lock); in cgx_link_change_handler()
679 struct lmac *lmac = data; in cgx_fwi_event_handler() local
683 cgx = lmac->cgx; in cgx_fwi_event_handler()
685 event = cgx_read(cgx, lmac->lmac_id, CGX_EVENT_REG); in cgx_fwi_event_handler()
695 lmac->resp = event; in cgx_fwi_event_handler()
703 cgx_link_change_handler(event, lmac); in cgx_fwi_event_handler()
706 lmac->cmd_pend = false; in cgx_fwi_event_handler()
707 wake_up_interruptible(&lmac->wq_cmd_cmplt); in cgx_fwi_event_handler()
711 cgx_link_change_handler(event, lmac); in cgx_fwi_event_handler()
719 cgx_write(lmac->cgx, lmac->lmac_id, CGX_EVENT_REG, 0); in cgx_fwi_event_handler()
720 cgx_write(lmac->cgx, lmac->lmac_id, CGXX_CMRX_INT, FW_CGX_INT); in cgx_fwi_event_handler()
731 struct lmac *lmac; in cgx_lmac_evh_register() local
733 lmac = lmac_pdata(lmac_id, cgx); in cgx_lmac_evh_register()
734 if (!lmac) in cgx_lmac_evh_register()
737 lmac->event_cb = *cb; in cgx_lmac_evh_register()
744 struct lmac *lmac; in cgx_lmac_evh_unregister() local
748 lmac = lmac_pdata(lmac_id, cgx); in cgx_lmac_evh_unregister()
749 if (!lmac) in cgx_lmac_evh_unregister()
752 spin_lock_irqsave(&lmac->event_cb_lock, flags); in cgx_lmac_evh_unregister()
753 lmac->event_cb.notify_link_chg = NULL; in cgx_lmac_evh_unregister()
754 lmac->event_cb.data = NULL; in cgx_lmac_evh_unregister()
755 spin_unlock_irqrestore(&lmac->event_cb_lock, flags); in cgx_lmac_evh_unregister()
853 struct lmac *lmac; in cgx_lmac_init() local
861 lmac = kcalloc(1, sizeof(struct lmac), GFP_KERNEL); in cgx_lmac_init()
862 if (!lmac) in cgx_lmac_init()
864 lmac->name = kcalloc(1, sizeof("cgx_fwi_xxx_yyy"), GFP_KERNEL); in cgx_lmac_init()
865 if (!lmac->name) in cgx_lmac_init()
867 sprintf(lmac->name, "cgx_fwi_%d_%d", cgx->cgx_id, i); in cgx_lmac_init()
868 lmac->lmac_id = i; in cgx_lmac_init()
869 lmac->cgx = cgx; in cgx_lmac_init()
870 init_waitqueue_head(&lmac->wq_cmd_cmplt); in cgx_lmac_init()
871 mutex_init(&lmac->cmd_lock); in cgx_lmac_init()
872 spin_lock_init(&lmac->event_cb_lock); in cgx_lmac_init()
875 cgx_fwi_event_handler, 0, lmac->name, lmac); in cgx_lmac_init()
880 cgx_write(cgx, lmac->lmac_id, CGXX_CMRX_INT_ENA_W1S, in cgx_lmac_init()
884 cgx->lmac_idmap[i] = lmac; in cgx_lmac_init()
893 struct lmac *lmac; in cgx_lmac_exit() local
905 lmac = cgx->lmac_idmap[i]; in cgx_lmac_exit()
906 if (!lmac) in cgx_lmac_exit()
908 free_irq(pci_irq_vector(cgx->pdev, CGX_LMAC_FWI + i * 9), lmac); in cgx_lmac_exit()
909 kfree(lmac->name); in cgx_lmac_exit()
910 kfree(lmac); in cgx_lmac_exit()