Lines Matching defs:kioc

105 	uioc_t		*kioc;
160 * if any previous kioc had timedout on this controller.
170 * The following call will block till a kioc is available
174 kioc = mraid_mm_alloc_kioc(adp);
175 if (!kioc)
181 if ((rval = mimd_to_kioc(argp, adp, kioc))) {
182 mraid_mm_dealloc_kioc(adp, kioc);
186 kioc->done = ioctl_done;
190 * release the kioc if and only if it was _not_ timedout. If it was
193 if ((rval = lld_ioctl(adp, kioc))) {
195 if (!kioc->timedout)
196 mraid_mm_dealloc_kioc(adp, kioc);
202 * Convert the kioc back to user space
204 rval = kioc_to_mimd(kioc, argp);
207 * Return the kioc to free pool
209 mraid_mm_dealloc_kioc(adp, kioc);
346 * @kioc : kernel space new format IOCTL
354 mimd_to_kioc(mimd_t __user *umimd, mraid_mmadp_t *adp, uioc_t *kioc)
381 kioc->adapno = adapno;
382 kioc->mb_type = MBOX_LEGACY;
383 kioc->app_type = APPTYPE_MIMD;
391 kioc->opcode = GET_ADAP_INFO;
392 kioc->data_dir = UIOC_RD;
393 kioc->xferlen = sizeof(mraid_hba_info_t);
395 if (mraid_mm_attach_buf(adp, kioc, kioc->xferlen))
408 kioc->opcode = MBOX_CMD;
409 kioc->xferlen = mimd.ui.fcs.length;
410 kioc->user_data_len = kioc->xferlen;
411 kioc->user_data = mimd.ui.fcs.buffer;
413 if (mraid_mm_attach_buf(adp, kioc, kioc->xferlen))
416 if (mimd.outlen) kioc->data_dir = UIOC_RD;
417 if (mimd.inlen) kioc->data_dir |= UIOC_WR;
423 kioc->opcode = MBOX_CMD;
424 kioc->xferlen = (mimd.outlen > mimd.inlen) ?
426 kioc->user_data_len = kioc->xferlen;
427 kioc->user_data = mimd.data;
429 if (mraid_mm_attach_buf(adp, kioc, kioc->xferlen))
432 if (mimd.outlen) kioc->data_dir = UIOC_RD;
433 if (mimd.inlen) kioc->data_dir |= UIOC_WR;
450 mbox64 = (mbox64_t *)((unsigned long)kioc->cmdbuf);
456 mbox->xferaddr = (uint32_t)kioc->buf_paddr;
458 if (kioc->data_dir & UIOC_WR) {
459 if (copy_from_user(kioc->buf_vaddr, kioc->user_data,
460 kioc->xferlen)) {
474 pthru32 = kioc->pthru32;
475 kioc->user_pthru = &umimd->pthru;
476 mbox->xferaddr = (uint32_t)kioc->pthru32_h;
478 if (copy_from_user(pthru32, kioc->user_pthru,
483 pthru32->dataxferaddr = kioc->buf_paddr;
484 if (kioc->data_dir & UIOC_WR) {
485 if (pthru32->dataxferlen > kioc->xferlen)
487 if (copy_from_user(kioc->buf_vaddr, kioc->user_data,
499 * @kioc : kioc that the buffer needs to be attached to
508 mraid_mm_attach_buf(mraid_mmadp_t *adp, uioc_t *kioc, int xferlen)
515 kioc->pool_index = -1;
516 kioc->buf_vaddr = NULL;
517 kioc->buf_paddr = 0;
518 kioc->free_buf = 0;
540 kioc->pool_index = i;
541 kioc->buf_vaddr = pool->vaddr;
542 kioc->buf_paddr = pool->paddr;
567 kioc->pool_index = right_pool;
568 kioc->free_buf = 1;
569 kioc->buf_vaddr = dma_pool_alloc(pool->handle, GFP_ATOMIC,
570 &kioc->buf_paddr);
573 if (!kioc->buf_vaddr)
583 * The kioc_semaphore is initialized with number of kioc nodes in the
584 * free kioc pool. If the kioc pool is empty, this function blocks till
585 * a kioc becomes free.
590 uioc_t *kioc;
604 con_log(CL_ANN, ("megaraid cmm: kioc list empty!\n"));
608 kioc = list_entry(head->next, uioc_t, list);
609 list_del_init(&kioc->list);
613 memset((caddr_t)(unsigned long)kioc->cmdbuf, 0, sizeof(mbox64_t));
614 memset((caddr_t) kioc->pthru32, 0, sizeof(mraid_passthru_t));
616 kioc->buf_vaddr = NULL;
617 kioc->buf_paddr = 0;
618 kioc->pool_index =-1;
619 kioc->free_buf = 0;
620 kioc->user_data = NULL;
621 kioc->user_data_len = 0;
622 kioc->user_pthru = NULL;
623 kioc->timedout = 0;
625 return kioc;
629 * mraid_mm_dealloc_kioc - Return kioc to free pool
631 * @kioc : uioc_t node to be returned to free pool
634 mraid_mm_dealloc_kioc(mraid_mmadp_t *adp, uioc_t *kioc)
639 if (kioc->pool_index != -1) {
640 pool = &adp->dma_pool_list[kioc->pool_index];
652 if (kioc->free_buf == 1)
653 dma_pool_free(pool->handle, kioc->buf_vaddr,
654 kioc->buf_paddr);
661 /* Return the kioc to the free pool */
663 list_add(&kioc->list, &adp->kioc_pool);
666 /* increment the free kioc count */
675 * @kioc : The ioctl packet with kernel addresses
678 lld_ioctl(mraid_mmadp_t *adp, uioc_t *kioc)
683 kioc->status = -ENODATA;
684 rval = adp->issue_uioc(adp->drvr_data, kioc, IOCTL_ISSUE);
692 timeout.uioc = kioc;
704 wait_event(wait_q, (kioc->status != -ENODATA));
714 if (kioc->timedout) {
718 return kioc->status;
724 * @kioc : completed ioctl packet
727 ioctl_done(uioc_t *kioc)
735 * When the kioc returns from driver, make sure it still doesn't
739 if (kioc->status == -ENODATA) {
743 kioc->status = -EINVAL;
747 * Check if this kioc was timedout before. If so, nobody is waiting
748 * on this kioc. We don't have to wake up anybody. Instead, we just
749 * have to free the kioc
751 if (kioc->timedout) {
754 adapno = kioc->adapno;
767 kioc->timedout = 0;
770 mraid_mm_dealloc_kioc( adapter, kioc );
787 uioc_t *kioc = timeout->uioc;
789 kioc->status = -ETIME;
790 kioc->timedout = 1;
800 * @kioc : Kernel space IOCTL packet (successfully issued)
804 kioc_to_mimd(uioc_t *kioc, mimd_t __user *mimd)
829 kioc->buf_vaddr;
845 mbox64 = (mbox64_t *)(unsigned long)kioc->cmdbuf;
847 if (kioc->user_pthru) {
849 upthru32 = kioc->user_pthru;
850 kpthru32 = kioc->pthru32;
859 if (kioc->user_data) {
860 if (copy_to_user(kioc->user_data, kioc->buf_vaddr,
861 kioc->user_data_len)) {
908 uioc_t *kioc;
969 kioc = adapter->kioc_list + i;
970 kioc->cmdbuf = (uint64_t)(unsigned long)(mbox_list + i);
971 kioc->pthru32 = dma_pool_alloc(adapter->pthru_dma_pool,
972 GFP_KERNEL, &kioc->pthru32_h);
974 if (!kioc->pthru32) {
985 list_add_tail(&kioc->list, &adapter->kioc_pool);
1005 kioc = adapter->kioc_list + i;
1006 if (kioc->pthru32) {
1007 dma_pool_free(adapter->pthru_dma_pool, kioc->pthru32,
1008 kioc->pthru32_h);
1155 uioc_t *kioc;
1162 kioc = adp->kioc_list + i;
1164 dma_pool_free(adp->pthru_dma_pool, kioc->pthru32,
1165 kioc->pthru32_h);