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