Lines Matching refs:host
246 struct carm_host *host; member
467 static inline void *carm_ref_msg(struct carm_host *host, in carm_ref_msg() argument
470 return host->msg_base + (msg_idx * CARM_MSG_SIZE); in carm_ref_msg()
473 static inline dma_addr_t carm_ref_msg_dma(struct carm_host *host, in carm_ref_msg_dma() argument
476 return host->msg_dma + (msg_idx * CARM_MSG_SIZE); in carm_ref_msg_dma()
479 static int carm_send_msg(struct carm_host *host, in carm_send_msg() argument
482 void __iomem *mmio = host->mmio; in carm_send_msg()
483 u32 msg = (u32) carm_ref_msg_dma(host, crq->tag); in carm_send_msg()
508 static struct carm_request *carm_get_request(struct carm_host *host) in carm_get_request() argument
513 if (host->hw_sg_used >= (CARM_MAX_HOST_SG - CARM_MAX_REQ_SG)) in carm_get_request()
517 if ((host->msg_alloc & (1ULL << i)) == 0) { in carm_get_request()
518 struct carm_request *crq = &host->req[i]; in carm_get_request()
522 host->msg_alloc |= (1ULL << i); in carm_get_request()
523 host->n_msgs++; in carm_get_request()
525 assert(host->n_msgs <= CARM_MAX_REQ); in carm_get_request()
534 static int carm_put_request(struct carm_host *host, struct carm_request *crq) in carm_put_request() argument
538 if (unlikely((host->msg_alloc & (1ULL << crq->tag)) == 0)) in carm_put_request()
541 assert(host->hw_sg_used >= crq->n_elem); in carm_put_request()
543 host->msg_alloc &= ~(1ULL << crq->tag); in carm_put_request()
544 host->hw_sg_used -= crq->n_elem; in carm_put_request()
545 host->n_msgs--; in carm_put_request()
550 static struct carm_request *carm_get_special(struct carm_host *host) in carm_get_special() argument
558 spin_lock_irqsave(&host->lock, flags); in carm_get_special()
559 crq = carm_get_request(host); in carm_get_special()
560 spin_unlock_irqrestore(&host->lock, flags); in carm_get_special()
570 rq = blk_get_request(host->oob_q, WRITE /* bogus */, GFP_KERNEL); in carm_get_special()
572 spin_lock_irqsave(&host->lock, flags); in carm_get_special()
573 carm_put_request(host, crq); in carm_get_special()
574 spin_unlock_irqrestore(&host->lock, flags); in carm_get_special()
582 static int carm_array_info (struct carm_host *host, unsigned int array_idx) in carm_array_info() argument
591 crq = carm_get_special(host); in carm_array_info()
599 ioc = carm_ref_msg(host, idx); in carm_array_info()
600 msg_dma = carm_ref_msg_dma(host, idx); in carm_array_info()
617 spin_lock_irq(&host->lock); in carm_array_info()
618 assert(host->state == HST_DEV_SCAN_START || in carm_array_info()
619 host->state == HST_DEV_SCAN); in carm_array_info()
620 spin_unlock_irq(&host->lock); in carm_array_info()
625 blk_execute_rq_nowait(host->oob_q, NULL, crq->rq, true, NULL); in carm_array_info()
630 spin_lock_irq(&host->lock); in carm_array_info()
631 host->state = HST_ERROR; in carm_array_info()
632 spin_unlock_irq(&host->lock); in carm_array_info()
638 static int carm_send_special (struct carm_host *host, carm_sspc_t func) in carm_send_special() argument
646 crq = carm_get_special(host); in carm_send_special()
652 mem = carm_ref_msg(host, idx); in carm_send_special()
654 msg_size = func(host, idx, mem); in carm_send_special()
666 blk_execute_rq_nowait(host->oob_q, NULL, crq->rq, true, NULL); in carm_send_special()
671 static unsigned int carm_fill_sync_time(struct carm_host *host, in carm_fill_sync_time() argument
688 static unsigned int carm_fill_alloc_buf(struct carm_host *host, in carm_fill_alloc_buf() argument
699 ab->addr = cpu_to_le32(host->shm_dma + (PDC_SHM_SIZE >> 1)); in carm_fill_alloc_buf()
701 ab->evt_pool = cpu_to_le32(host->shm_dma + (16 * 1024)); in carm_fill_alloc_buf()
703 ab->rbuf_pool = cpu_to_le32(host->shm_dma); in carm_fill_alloc_buf()
705 ab->msg_pool = cpu_to_le32(host->shm_dma + RBUF_LEN); in carm_fill_alloc_buf()
707 ab->sg[0].start = cpu_to_le32(host->shm_dma + (PDC_SHM_SIZE >> 1)); in carm_fill_alloc_buf()
713 static unsigned int carm_fill_scan_channels(struct carm_host *host, in carm_fill_scan_channels() argument
717 u32 msg_data = (u32) (carm_ref_msg_dma(host, idx) + in carm_fill_scan_channels()
733 static unsigned int carm_fill_get_fw_ver(struct carm_host *host, in carm_fill_get_fw_ver() argument
737 u32 msg_data = (u32) (carm_ref_msg_dma(host, idx) + sizeof(*ioc)); in carm_fill_get_fw_ver()
749 static inline void carm_end_request_queued(struct carm_host *host, in carm_end_request_queued() argument
758 rc = carm_put_request(host, crq); in carm_end_request_queued()
762 static inline void carm_push_q (struct carm_host *host, struct request_queue *q) in carm_push_q() argument
764 unsigned int idx = host->wait_q_prod % CARM_MAX_WAIT_Q; in carm_push_q()
769 host->wait_q[idx] = q; in carm_push_q()
770 host->wait_q_prod++; in carm_push_q()
771 BUG_ON(host->wait_q_prod == host->wait_q_cons); /* overrun */ in carm_push_q()
774 static inline struct request_queue *carm_pop_q(struct carm_host *host) in carm_pop_q() argument
778 if (host->wait_q_prod == host->wait_q_cons) in carm_pop_q()
781 idx = host->wait_q_cons % CARM_MAX_WAIT_Q; in carm_pop_q()
782 host->wait_q_cons++; in carm_pop_q()
784 return host->wait_q[idx]; in carm_pop_q()
787 static inline void carm_round_robin(struct carm_host *host) in carm_round_robin() argument
789 struct request_queue *q = carm_pop_q(host); in carm_round_robin()
796 static inline void carm_end_rq(struct carm_host *host, struct carm_request *crq, in carm_end_rq() argument
799 carm_end_request_queued(host, crq, error); in carm_end_rq()
801 carm_round_robin(host); in carm_end_rq()
802 else if ((host->n_msgs <= CARM_MSG_LOW_WATER) && in carm_end_rq()
803 (host->hw_sg_used <= CARM_SG_LOW_WATER)) { in carm_end_rq()
804 carm_round_robin(host); in carm_end_rq()
810 struct carm_host *host = q->queuedata; in carm_oob_rq_fn() local
828 rc = carm_send_msg(host, crq); in carm_oob_rq_fn()
831 carm_push_q(host, q); in carm_oob_rq_fn()
840 struct carm_host *host = port->host; in carm_rq_fn() local
855 crq = carm_get_request(host); in carm_rq_fn()
857 carm_push_q(host, q); in carm_rq_fn()
875 carm_end_rq(host, crq, -EIO); in carm_rq_fn()
880 n_elem = pci_map_sg(host->pdev, sg, n_elem, pci_dir); in carm_rq_fn()
882 carm_end_rq(host, crq, -EIO); in carm_rq_fn()
887 host->hw_sg_used += n_elem; in carm_rq_fn()
894 msg = (struct carm_msg_rw *) carm_ref_msg(host, crq->tag); in carm_rq_fn()
930 rc = carm_send_msg(host, crq); in carm_rq_fn()
932 carm_put_request(host, crq); in carm_rq_fn()
934 carm_push_q(host, q); in carm_rq_fn()
941 static void carm_handle_array_info(struct carm_host *host, in carm_handle_array_info() argument
954 carm_end_rq(host, crq, error); in carm_handle_array_info()
961 cur_port = host->cur_scan_dev; in carm_handle_array_info()
970 port = &host->port[cur_port]; in carm_handle_array_info()
980 host->dev_active |= (1 << cur_port); in carm_handle_array_info()
991 pci_name(host->pdev), port->port_no, in carm_handle_array_info()
994 pci_name(host->pdev), port->port_no, port->name); in carm_handle_array_info()
997 assert(host->state == HST_DEV_SCAN); in carm_handle_array_info()
998 schedule_work(&host->fsm_task); in carm_handle_array_info()
1001 static void carm_handle_scan_chan(struct carm_host *host, in carm_handle_scan_chan() argument
1011 carm_end_rq(host, crq, error); in carm_handle_scan_chan()
1021 host->dev_present |= (1 << i); in carm_handle_scan_chan()
1026 pci_name(host->pdev), dev_count); in carm_handle_scan_chan()
1029 assert(host->state == HST_PORT_SCAN); in carm_handle_scan_chan()
1030 host->state = new_state; in carm_handle_scan_chan()
1031 schedule_work(&host->fsm_task); in carm_handle_scan_chan()
1034 static void carm_handle_generic(struct carm_host *host, in carm_handle_generic() argument
1040 carm_end_rq(host, crq, error); in carm_handle_generic()
1042 assert(host->state == cur_state); in carm_handle_generic()
1044 host->state = HST_ERROR; in carm_handle_generic()
1046 host->state = next_state; in carm_handle_generic()
1047 schedule_work(&host->fsm_task); in carm_handle_generic()
1050 static inline void carm_handle_rw(struct carm_host *host, in carm_handle_rw() argument
1062 pci_unmap_sg(host->pdev, &crq->sg[0], crq->n_elem, pci_dir); in carm_handle_rw()
1064 carm_end_rq(host, crq, error); in carm_handle_rw()
1067 static inline void carm_handle_resp(struct carm_host *host, in carm_handle_resp() argument
1080 pci_name(host->pdev), handle); in carm_handle_resp()
1087 crq = &host->req[msg_idx]; in carm_handle_resp()
1092 carm_handle_rw(host, crq, error); in carm_handle_resp()
1096 mem = carm_ref_msg(host, msg_idx); in carm_handle_resp()
1102 carm_handle_scan_chan(host, crq, mem, error); in carm_handle_resp()
1114 carm_handle_generic(host, crq, error, in carm_handle_resp()
1118 carm_handle_generic(host, crq, error, in carm_handle_resp()
1125 host->fw_ver = le32_to_cpu(ver->version); in carm_handle_resp()
1126 host->flags |= (ver->features & FL_FW_VER_MASK); in carm_handle_resp()
1128 carm_handle_generic(host, crq, error, in carm_handle_resp()
1142 carm_handle_array_info(host, crq, mem, error); in carm_handle_resp()
1160 pci_name(host->pdev), crq->msg_type, crq->msg_subtype); in carm_handle_resp()
1161 carm_end_rq(host, crq, -EIO); in carm_handle_resp()
1164 static inline void carm_handle_responses(struct carm_host *host) in carm_handle_responses() argument
1166 void __iomem *mmio = host->mmio; in carm_handle_responses()
1167 struct carm_response *resp = (struct carm_response *) host->shm; in carm_handle_responses()
1169 unsigned int idx = host->resp_idx % RMSG_Q_LEN; in carm_handle_responses()
1183 carm_handle_resp(host, resp[idx].ret_handle, status); in carm_handle_responses()
1192 pci_name(host->pdev), (int) evt_type); in carm_handle_responses()
1201 host->resp_idx += work; in carm_handle_responses()
1206 struct carm_host *host = __host; in carm_interrupt() local
1212 if (!host) { in carm_interrupt()
1217 spin_lock_irqsave(&host->lock, flags); in carm_interrupt()
1219 mmio = host->mmio; in carm_interrupt()
1232 if (unlikely(host->state == HST_INVALID)) { in carm_interrupt()
1239 carm_handle_responses(host); in carm_interrupt()
1243 spin_unlock_irqrestore(&host->lock, flags); in carm_interrupt()
1250 struct carm_host *host = in carm_fsm_task() local
1258 spin_lock_irqsave(&host->lock, flags); in carm_fsm_task()
1259 state = host->state; in carm_fsm_task()
1260 spin_unlock_irqrestore(&host->lock, flags); in carm_fsm_task()
1271 rc = carm_send_special(host, carm_fill_alloc_buf); in carm_fsm_task()
1279 rc = carm_send_special(host, carm_fill_sync_time); in carm_fsm_task()
1287 rc = carm_send_special(host, carm_fill_get_fw_ver); in carm_fsm_task()
1295 rc = carm_send_special(host, carm_fill_scan_channels); in carm_fsm_task()
1303 host->cur_scan_dev = -1; in carm_fsm_task()
1310 for (i = host->cur_scan_dev + 1; i < CARM_MAX_PORTS; i++) in carm_fsm_task()
1311 if (host->dev_present & (1 << i)) { in carm_fsm_task()
1317 host->cur_scan_dev = next_dev; in carm_fsm_task()
1318 rc = carm_array_info(host, next_dev); in carm_fsm_task()
1332 if (host->dev_active & (1 << i)) { in carm_fsm_task()
1333 struct carm_port *port = &host->port[i]; in carm_fsm_task()
1342 pci_name(host->pdev), activated); in carm_fsm_task()
1350 complete(&host->probe_comp); in carm_fsm_task()
1365 spin_lock_irqsave(&host->lock, flags); in carm_fsm_task()
1366 host->state = new_state; in carm_fsm_task()
1367 spin_unlock_irqrestore(&host->lock, flags); in carm_fsm_task()
1370 schedule_work(&host->fsm_task); in carm_fsm_task()
1397 static void carm_init_responses(struct carm_host *host) in carm_init_responses() argument
1399 void __iomem *mmio = host->mmio; in carm_init_responses()
1401 struct carm_response *resp = (struct carm_response *) host->shm; in carm_init_responses()
1409 static int carm_init_host(struct carm_host *host) in carm_init_host() argument
1411 void __iomem *mmio = host->mmio; in carm_init_host()
1460 writel(host->shm_dma & 0xffffffff, mmio + RBUF_ADDR_LO); in carm_init_host()
1461 writel((host->shm_dma >> 16) >> 16, mmio + RBUF_ADDR_HI); in carm_init_host()
1478 carm_init_responses(host); in carm_init_host()
1481 spin_lock_irq(&host->lock); in carm_init_host()
1482 assert(host->state == HST_INVALID); in carm_init_host()
1483 host->state = HST_PROBE_START; in carm_init_host()
1484 spin_unlock_irq(&host->lock); in carm_init_host()
1485 schedule_work(&host->fsm_task); in carm_init_host()
1491 static int carm_init_disks(struct carm_host *host) in carm_init_disks() argument
1501 port = &host->port[i]; in carm_init_disks()
1502 port->host = host; in carm_init_disks()
1513 (unsigned int) (host->id * CARM_MAX_PORTS) + i); in carm_init_disks()
1514 disk->major = host->major; in carm_init_disks()
1519 q = blk_init_queue(carm_rq_fn, &host->lock); in carm_init_disks()
1534 static void carm_free_disks(struct carm_host *host) in carm_free_disks() argument
1539 struct gendisk *disk = host->port[i].disk; in carm_free_disks()
1552 static int carm_init_shm(struct carm_host *host) in carm_init_shm() argument
1554 host->shm = pci_alloc_consistent(host->pdev, CARM_SHM_SIZE, in carm_init_shm()
1555 &host->shm_dma); in carm_init_shm()
1556 if (!host->shm) in carm_init_shm()
1559 host->msg_base = host->shm + RBUF_LEN; in carm_init_shm()
1560 host->msg_dma = host->shm_dma + RBUF_LEN; in carm_init_shm()
1562 memset(host->shm, 0xff, RBUF_LEN); in carm_init_shm()
1563 memset(host->msg_base, 0, PDC_SHM_SIZE - RBUF_LEN); in carm_init_shm()
1570 struct carm_host *host; in carm_init_one() local
1609 host = kzalloc(sizeof(*host), GFP_KERNEL); in carm_init_one()
1610 if (!host) { in carm_init_one()
1617 host->pdev = pdev; in carm_init_one()
1618 host->flags = pci_dac ? FL_DAC : 0; in carm_init_one()
1619 spin_lock_init(&host->lock); in carm_init_one()
1620 INIT_WORK(&host->fsm_task, carm_fsm_task); in carm_init_one()
1621 init_completion(&host->probe_comp); in carm_init_one()
1623 for (i = 0; i < ARRAY_SIZE(host->req); i++) in carm_init_one()
1624 host->req[i].tag = i; in carm_init_one()
1626 host->mmio = ioremap(pci_resource_start(pdev, 0), in carm_init_one()
1628 if (!host->mmio) { in carm_init_one()
1635 rc = carm_init_shm(host); in carm_init_one()
1642 q = blk_init_queue(carm_oob_rq_fn, &host->lock); in carm_init_one()
1649 host->oob_q = q; in carm_init_one()
1650 q->queuedata = host; in carm_init_one()
1656 host->major = 160; in carm_init_one()
1658 host->major = 161; in carm_init_one()
1660 host->flags |= FL_DYN_MAJOR; in carm_init_one()
1662 host->id = carm_host_id; in carm_init_one()
1663 sprintf(host->name, DRV_NAME "%d", carm_host_id); in carm_init_one()
1665 rc = register_blkdev(host->major, host->name); in carm_init_one()
1668 if (host->flags & FL_DYN_MAJOR) in carm_init_one()
1669 host->major = rc; in carm_init_one()
1671 rc = carm_init_disks(host); in carm_init_one()
1677 rc = request_irq(pdev->irq, carm_interrupt, IRQF_SHARED, DRV_NAME, host); in carm_init_one()
1684 rc = carm_init_host(host); in carm_init_one()
1689 wait_for_completion(&host->probe_comp); in carm_init_one()
1692 host->name, pci_name(pdev), (int) CARM_MAX_PORTS, in carm_init_one()
1694 pdev->irq, host->major); in carm_init_one()
1697 pci_set_drvdata(pdev, host); in carm_init_one()
1701 free_irq(pdev->irq, host); in carm_init_one()
1703 carm_free_disks(host); in carm_init_one()
1704 unregister_blkdev(host->major, host->name); in carm_init_one()
1706 if (host->major == 160) in carm_init_one()
1708 else if (host->major == 161) in carm_init_one()
1710 blk_cleanup_queue(host->oob_q); in carm_init_one()
1712 pci_free_consistent(pdev, CARM_SHM_SIZE, host->shm, host->shm_dma); in carm_init_one()
1714 iounmap(host->mmio); in carm_init_one()
1716 kfree(host); in carm_init_one()
1726 struct carm_host *host = pci_get_drvdata(pdev); in carm_remove_one() local
1728 if (!host) { in carm_remove_one()
1734 free_irq(pdev->irq, host); in carm_remove_one()
1735 carm_free_disks(host); in carm_remove_one()
1736 unregister_blkdev(host->major, host->name); in carm_remove_one()
1737 if (host->major == 160) in carm_remove_one()
1739 else if (host->major == 161) in carm_remove_one()
1741 blk_cleanup_queue(host->oob_q); in carm_remove_one()
1742 pci_free_consistent(pdev, CARM_SHM_SIZE, host->shm, host->shm_dma); in carm_remove_one()
1743 iounmap(host->mmio); in carm_remove_one()
1744 kfree(host); in carm_remove_one()