gdth_proc.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 1,112 行 · 第 1/3 页

C
1,112
字号
            gdth_do_req(scp, &gdtcmd, cmnd, 30);            if (scp->sr_command->SCp.Status != S_OK) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)            gdth_do_cmd(scp, &gdtcmd, cmnd, 30);            if (scp->SCp.Status != S_OK) #else            gdth_do_cmd(&scp, &gdtcmd, cmnd, 30);            if (scp.SCp.Status != S_OK) #endif            {                ha->hdr[i].ldr_no = i;                ha->hdr[i].rw_attribs = 0;                ha->hdr[i].start_sec = 0;            } else {                for (j = 0; j < phg->entries; ++j) {                    k = phg->entry[j].host_drive;                    if (k >= MAX_LDRIVES)                        continue;                    ha->hdr[k].ldr_no = phg->entry[j].log_drive;                    ha->hdr[k].rw_attribs = phg->entry[j].rw_attribs;                    ha->hdr[k].start_sec = phg->entry[j].start_sec;                }            }        }        gdth_ioctl_free(hanum, sizeof(gdth_hget_str), buf, paddr);        for (i = 0; i < MAX_HDRIVES; ++i) {            if (!(ha->hdr[i].present))                continue;                          size = sprintf(buffer+len,                           "\n Number:       \t%-2d        \tArr/Log. Drive:\t%d\n",                           i, ha->hdr[i].ldr_no);            len += size;  pos = begin + len;            flag = TRUE;            size = sprintf(buffer+len,                           " Capacity [MB]:\t%-6d    \tStart Sector:  \t%d\n",                           (ulong32)(ha->hdr[i].size/2048), ha->hdr[i].start_sec);            len += size;  pos = begin + len;            if (pos < offset) {                len = 0;                begin = pos;            }            if (pos > offset + length)                goto stop_output;        }                if (!flag) {            size = sprintf(buffer+len, "\n --\n");            len += size;  pos = begin + len;        }    }    /* controller events */    size = sprintf(buffer+len,"\nController Events:\n");    len += size;  pos = begin + len;    for (id = -1;;) {        id = gdth_read_event(ha, id, &estr);        if (estr.event_source == 0)            break;        if (estr.event_data.eu.driver.ionode == hanum &&            estr.event_source == ES_ASYNC) {             gdth_log_event(&estr.event_data, hrec);            do_gettimeofday(&tv);            sec = (int)(tv.tv_sec - estr.first_stamp);            if (sec < 0) sec = 0;            size = sprintf(buffer+len," date- %02d:%02d:%02d\t%s\n",                           sec/3600, sec%3600/60, sec%60, hrec);            len += size;  pos = begin + len;            if (pos < offset) {                len = 0;                begin = pos;            }            if (pos > offset + length)                goto stop_output;        }        if (id == -1)            break;    }stop_output:#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)    scsi_release_request(scp);    scsi_free_host_dev(sdev);#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)    scsi_release_command(scp);    scsi_free_host_dev(sdev);#endif    *start = buffer +(offset-begin);    len -= (offset-begin);    if (len > length)        len = length;    TRACE2(("get_info() len %d pos %d begin %d offset %d length %d size %d\n",            len,(int)pos,(int)begin,(int)offset,length,size));    return(len);}#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)static void gdth_do_req(Scsi_Request *scp, gdth_cmd_str *gdtcmd,                         char *cmnd, int timeout){    unsigned bufflen;    DECLARE_COMPLETION(wait);    TRACE2(("gdth_do_req()\n"));    if (gdtcmd != NULL) {         bufflen = sizeof(gdth_cmd_str);    } else {        bufflen = 0;    }    scp->sr_request->rq_status = RQ_SCSI_BUSY;    scp->sr_request->waiting = &wait;    scsi_do_req(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);    wait_for_completion(&wait);}#elsestatic void gdth_do_cmd(Scsi_Cmnd *scp, gdth_cmd_str *gdtcmd,                         char *cmnd, int timeout){    unsigned bufflen;#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)    DECLARE_COMPLETION(wait);#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)    DECLARE_MUTEX_LOCKED(sem);#else    struct semaphore sem = MUTEX_LOCKED;#endif    TRACE2(("gdth_do_cmd()\n"));    if (gdtcmd != NULL) {         scp->SCp.this_residual = IOCTL_PRI;        bufflen = sizeof(gdth_cmd_str);    } else {        scp->SCp.this_residual = DEFAULT_PRI;        bufflen = 0;    }#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)    scp->request.rq_status = RQ_SCSI_BUSY;    scp->request.waiting = &wait;    scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);    wait_for_completion(&wait);#else    scp->request.sem = &sem;#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)    scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);#else    spin_lock_irq(&io_request_lock);    scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);    spin_unlock_irq(&io_request_lock);#endif    down(&sem);#endif}#endifvoid gdth_scsi_done(Scsi_Cmnd *scp){    TRACE2(("gdth_scsi_done()\n"));#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)    scp->request->rq_status = RQ_SCSI_DONE;    if (scp->request->waiting != NULL)        complete(scp->request->waiting);#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)    scp->request.rq_status = RQ_SCSI_DONE;    if (scp->request.waiting != NULL)        complete(scp->request.waiting);#else    scp->request.rq_status = RQ_SCSI_DONE;    if (scp->request.sem != NULL)        up(scp->request.sem);#endif}static char *gdth_ioctl_alloc(int hanum, int size, int scratch,                               ulong64 *paddr){    gdth_ha_str *ha;    ulong flags;    char *ret_val;    if (size == 0)        return NULL;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    if (!ha->scratch_busy && size <= GDTH_SCRATCH) {        ha->scratch_busy = TRUE;        ret_val = ha->pscratch;        *paddr = ha->scratch_phys;    } else if (scratch) {        ret_val = NULL;    } else {#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)        dma_addr_t dma_addr;        ret_val = pci_alloc_consistent(ha->pdev, size, &dma_addr);        *paddr = dma_addr;#else        ret_val = scsi_init_malloc(size, GFP_ATOMIC | GFP_DMA);        if (ret_val)            *paddr = virt_to_bus(ret_val);#endif    }    GDTH_UNLOCK_HA(ha, flags);    return ret_val;}static void gdth_ioctl_free(int hanum, int size, char *buf, ulong64 paddr){    gdth_ha_str *ha;    ulong flags;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    if (buf == ha->pscratch) {        ha->scratch_busy = FALSE;    } else {#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)        pci_free_consistent(ha->pdev, size, buf, paddr);#else        scsi_init_free((void *)buf, size);#endif    }    GDTH_UNLOCK_HA(ha, flags);}#ifdef GDTH_IOCTL_PROCstatic int gdth_ioctl_check_bin(int hanum, ushort size){    gdth_ha_str *ha;    ulong flags;    int ret_val;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    ret_val = FALSE;    if (ha->scratch_busy) {        if (((gdth_iord_str *)ha->pscratch)->size == (ulong32)size)            ret_val = TRUE;    }    GDTH_UNLOCK_HA(ha, flags);    return ret_val;}#endifstatic void gdth_wait_completion(int hanum, int busnum, int id){    gdth_ha_str *ha;    ulong flags;    int i;    Scsi_Cmnd *scp;    unchar b, t;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (i = 0; i < GDTH_MAXCMDS; ++i) {        scp = ha->cmd_tab[i].cmnd;#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)        b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;        t = scp->device->id;#else        b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel;        t = scp->target;#endif        if (!SPECIAL_SCP(scp) && t == (unchar)id &&             b == (unchar)busnum) {            scp->SCp.have_data_in = 0;            GDTH_UNLOCK_HA(ha, flags);            while (!scp->SCp.have_data_in)                barrier();#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)            GDTH_LOCK_SCSI_DONE(scp->device->host, flags);            scp->scsi_done(scp);            GDTH_UNLOCK_SCSI_DONE(scp->device->host, flags);#else            GDTH_LOCK_SCSI_DONE(flags);            scp->scsi_done(scp);            GDTH_UNLOCK_SCSI_DONE(flags);#endif        GDTH_LOCK_HA(ha, flags);        }    }    GDTH_UNLOCK_HA(ha, flags);}static void gdth_stop_timeout(int hanum, int busnum, int id){    gdth_ha_str *ha;    ulong flags;    Scsi_Cmnd *scp;    unchar b, t;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)        b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;        t = scp->device->id;#else        b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel;        t = scp->target;#endif        if (t == (unchar)id && b == (unchar)busnum) {            TRACE2(("gdth_stop_timeout(): update_timeout()\n"));            scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0);        }    }    GDTH_UNLOCK_HA(ha, flags);}static void gdth_start_timeout(int hanum, int busnum, int id){    gdth_ha_str *ha;    ulong flags;    Scsi_Cmnd *scp;    unchar b, t;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)        b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;        t = scp->device->id;#else        b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel;        t = scp->target;#endif        if (t == (unchar)id && b == (unchar)busnum) {            TRACE2(("gdth_start_timeout(): update_timeout()\n"));            gdth_update_timeout(hanum, scp, scp->SCp.buffers_residual);        }    }    GDTH_UNLOCK_HA(ha, flags);}static int gdth_update_timeout(int hanum, Scsi_Cmnd *scp, int timeout){    int oldto;    oldto = scp->timeout_per_command;    scp->timeout_per_command = timeout;    if (timeout == 0) {        del_timer(&scp->eh_timeout);        scp->eh_timeout.data = (unsigned long) NULL;        scp->eh_timeout.expires = 0;    } else {        if (scp->eh_timeout.data != (unsigned long) NULL)             del_timer(&scp->eh_timeout);        scp->eh_timeout.data = (unsigned long) scp;        scp->eh_timeout.expires = jiffies + timeout;        add_timer(&scp->eh_timeout);    }    return oldto;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?