Lines Matching refs:ism

38 static int ism_cmd(struct ism_dev *ism, void *cmd)  in ism_cmd()  argument
43 __ism_write_cmd(ism, req + 1, sizeof(*req), req->len - sizeof(*req)); in ism_cmd()
44 __ism_write_cmd(ism, req, 0, sizeof(*req)); in ism_cmd()
48 __ism_read_cmd(ism, resp, 0, sizeof(*resp)); in ism_cmd()
54 __ism_read_cmd(ism, resp + 1, sizeof(*resp), resp->len - sizeof(*resp)); in ism_cmd()
59 static int ism_cmd_simple(struct ism_dev *ism, u32 cmd_code) in ism_cmd_simple() argument
67 return ism_cmd(ism, &cmd); in ism_cmd_simple()
70 static int query_info(struct ism_dev *ism) in query_info() argument
78 if (ism_cmd(ism, &cmd)) in query_info()
87 static int register_sba(struct ism_dev *ism) in register_sba() argument
93 sba = dma_alloc_coherent(&ism->pdev->dev, PAGE_SIZE, &dma_handle, in register_sba()
103 if (ism_cmd(ism, &cmd)) { in register_sba()
104 dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, sba, dma_handle); in register_sba()
108 ism->sba = sba; in register_sba()
109 ism->sba_dma_addr = dma_handle; in register_sba()
114 static int register_ieq(struct ism_dev *ism) in register_ieq() argument
120 ieq = dma_alloc_coherent(&ism->pdev->dev, PAGE_SIZE, &dma_handle, in register_ieq()
131 if (ism_cmd(ism, &cmd)) { in register_ieq()
132 dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, ieq, dma_handle); in register_ieq()
136 ism->ieq = ieq; in register_ieq()
137 ism->ieq_idx = -1; in register_ieq()
138 ism->ieq_dma_addr = dma_handle; in register_ieq()
143 static int unregister_sba(struct ism_dev *ism) in unregister_sba() argument
147 if (!ism->sba) in unregister_sba()
150 ret = ism_cmd_simple(ism, ISM_UNREG_SBA); in unregister_sba()
154 dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, in unregister_sba()
155 ism->sba, ism->sba_dma_addr); in unregister_sba()
157 ism->sba = NULL; in unregister_sba()
158 ism->sba_dma_addr = 0; in unregister_sba()
163 static int unregister_ieq(struct ism_dev *ism) in unregister_ieq() argument
167 if (!ism->ieq) in unregister_ieq()
170 ret = ism_cmd_simple(ism, ISM_UNREG_IEQ); in unregister_ieq()
174 dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, in unregister_ieq()
175 ism->ieq, ism->ieq_dma_addr); in unregister_ieq()
177 ism->ieq = NULL; in unregister_ieq()
178 ism->ieq_dma_addr = 0; in unregister_ieq()
183 static int ism_read_local_gid(struct ism_dev *ism) in ism_read_local_gid() argument
192 ret = ism_cmd(ism, &cmd); in ism_read_local_gid()
196 ism->smcd->local_gid = cmd.response.gid; in ism_read_local_gid()
204 struct ism_dev *ism = smcd->priv; in ism_query_rgid() local
215 return ism_cmd(ism, &cmd); in ism_query_rgid()
218 static void ism_free_dmb(struct ism_dev *ism, struct smcd_dmb *dmb) in ism_free_dmb() argument
220 clear_bit(dmb->sba_idx, ism->sba_bitmap); in ism_free_dmb()
221 dma_free_coherent(&ism->pdev->dev, dmb->dmb_len, in ism_free_dmb()
225 static int ism_alloc_dmb(struct ism_dev *ism, struct smcd_dmb *dmb) in ism_alloc_dmb() argument
229 if (PAGE_ALIGN(dmb->dmb_len) > dma_get_max_seg_size(&ism->pdev->dev)) in ism_alloc_dmb()
233 bit = find_next_zero_bit(ism->sba_bitmap, ISM_NR_DMBS, in ism_alloc_dmb()
241 test_and_set_bit(dmb->sba_idx, ism->sba_bitmap)) in ism_alloc_dmb()
244 dmb->cpu_addr = dma_alloc_coherent(&ism->pdev->dev, dmb->dmb_len, in ism_alloc_dmb()
248 clear_bit(dmb->sba_idx, ism->sba_bitmap); in ism_alloc_dmb()
255 struct ism_dev *ism = smcd->priv; in ism_register_dmb() local
259 ret = ism_alloc_dmb(ism, dmb); in ism_register_dmb()
274 ret = ism_cmd(ism, &cmd); in ism_register_dmb()
276 ism_free_dmb(ism, dmb); in ism_register_dmb()
286 struct ism_dev *ism = smcd->priv; in ism_unregister_dmb() local
296 ret = ism_cmd(ism, &cmd); in ism_unregister_dmb()
300 ism_free_dmb(ism, dmb); in ism_unregister_dmb()
307 struct ism_dev *ism = smcd->priv; in ism_add_vlan_id() local
316 return ism_cmd(ism, &cmd); in ism_add_vlan_id()
321 struct ism_dev *ism = smcd->priv; in ism_del_vlan_id() local
330 return ism_cmd(ism, &cmd); in ism_del_vlan_id()
346 struct ism_dev *ism = smcd->priv; in ism_signal_ieq() local
358 return ism_cmd(ism, &cmd); in ism_signal_ieq()
370 struct ism_dev *ism = smcd->priv; in ism_move() local
380 ret = __ism_move(ism, dmb_req, data, bytes); in ism_move()
428 static void ism_handle_event(struct ism_dev *ism) in ism_handle_event() argument
432 while ((ism->ieq_idx + 1) != READ_ONCE(ism->ieq->header.idx)) { in ism_handle_event()
433 if (++(ism->ieq_idx) == ARRAY_SIZE(ism->ieq->entry)) in ism_handle_event()
434 ism->ieq_idx = 0; in ism_handle_event()
436 entry = &ism->ieq->entry[ism->ieq_idx]; in ism_handle_event()
438 smcd_handle_event(ism->smcd, entry); in ism_handle_event()
444 struct ism_dev *ism = data; in ism_handle_irq() local
448 bv = (void *) &ism->sba->dmb_bits[ISM_DMB_WORD_OFFSET]; in ism_handle_irq()
449 end = sizeof(ism->sba->dmb_bits) * BITS_PER_BYTE - ISM_DMB_BIT_OFFSET; in ism_handle_irq()
451 spin_lock(&ism->lock); in ism_handle_irq()
452 ism->sba->s = 0; in ism_handle_irq()
460 ism->sba->dmbe_mask[bit + ISM_DMB_BIT_OFFSET] = 0; in ism_handle_irq()
462 smcd_handle_irq(ism->smcd, bit + ISM_DMB_BIT_OFFSET); in ism_handle_irq()
465 if (ism->sba->e) { in ism_handle_irq()
466 ism->sba->e = 0; in ism_handle_irq()
468 ism_handle_event(ism); in ism_handle_irq()
470 spin_unlock(&ism->lock); in ism_handle_irq()
488 static int ism_dev_init(struct ism_dev *ism) in ism_dev_init() argument
490 struct pci_dev *pdev = ism->pdev; in ism_dev_init()
498 pci_name(pdev), ism); in ism_dev_init()
502 ret = register_sba(ism); in ism_dev_init()
506 ret = register_ieq(ism); in ism_dev_init()
510 ret = ism_read_local_gid(ism); in ism_dev_init()
514 if (!ism_add_vlan_id(ism->smcd, ISM_RESERVED_VLANID)) in ism_dev_init()
518 ret = smcd_register_dev(ism->smcd); in ism_dev_init()
522 query_info(ism); in ism_dev_init()
526 unregister_ieq(ism); in ism_dev_init()
528 unregister_sba(ism); in ism_dev_init()
530 free_irq(pci_irq_vector(pdev, 0), ism); in ism_dev_init()
539 struct ism_dev *ism; in ism_probe() local
542 ism = kzalloc(sizeof(*ism), GFP_KERNEL); in ism_probe()
543 if (!ism) in ism_probe()
546 spin_lock_init(&ism->lock); in ism_probe()
547 dev_set_drvdata(&pdev->dev, ism); in ism_probe()
548 ism->pdev = pdev; in ism_probe()
566 ism->smcd = smcd_alloc_dev(&pdev->dev, dev_name(&pdev->dev), &ism_ops, in ism_probe()
568 if (!ism->smcd) { in ism_probe()
573 ism->smcd->priv = ism; in ism_probe()
574 ret = ism_dev_init(ism); in ism_probe()
581 smcd_free_dev(ism->smcd); in ism_probe()
587 kfree(ism); in ism_probe()
592 static void ism_dev_exit(struct ism_dev *ism) in ism_dev_exit() argument
594 struct pci_dev *pdev = ism->pdev; in ism_dev_exit()
596 smcd_unregister_dev(ism->smcd); in ism_dev_exit()
599 ism_del_vlan_id(ism->smcd, ISM_RESERVED_VLANID); in ism_dev_exit()
600 unregister_ieq(ism); in ism_dev_exit()
601 unregister_sba(ism); in ism_dev_exit()
602 free_irq(pci_irq_vector(pdev, 0), ism); in ism_dev_exit()
608 struct ism_dev *ism = dev_get_drvdata(&pdev->dev); in ism_remove() local
610 ism_dev_exit(ism); in ism_remove()
612 smcd_free_dev(ism->smcd); in ism_remove()
616 kfree(ism); in ism_remove()