⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdth_proc.c

📁 linux和2410结合开发 用他可以生成2410所需的zImage文件
💻 C
📖 第 1 页 / 共 4 页
字号:
                        len = 0;                        begin = pos;                    }                    if (pos > offset + length)                        goto stop_output;                }            }            gdth_ioctl_free(hanum, buf);                    if (!flag) {                size = sprintf(buffer+len, "\n --\n");                len += size;  pos = begin + len;            }            /* 5. about host drives */            size = sprintf(buffer+len,"\nHost Drives:");            len += size;  pos = begin + len;            flag = FALSE;            buf = gdth_ioctl_alloc(hanum, GDTH_SCRATCH, FALSE);            if (!buf)                 goto stop_output;            for (i = 0; i < MAX_LDRIVES; ++i) {                if (!ha->hdr[i].is_logdrv ||                     (ha->hdr[i].is_arraydrv && !ha->hdr[i].is_master))                    continue;                /* 5.a get host drive list */                TRACE2(("host_get() drv_no %d\n",i));                           phg = (gdth_hget_str *)buf;                gdtcmd.Service = CACHESERVICE;                gdtcmd.OpCode = GDT_IOCTL;                gdtcmd.u.ioctl.p_param = virt_to_bus(phg);                gdtcmd.u.ioctl.param_size = sizeof(gdth_hget_str);                gdtcmd.u.ioctl.subfunc = HOST_GET | LA_CTRL_PATTERN;                gdtcmd.u.ioctl.channel = i;                phg->entries = MAX_HDRIVES;                phg->offset = GDTOFFSOF(gdth_hget_str, entry[0]); #if LINUX_VERSION_CODE >= 0x020322                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, buf);            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",                               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;        }    } else {        /* request from tool (GDTMON,..) */        piord = (gdth_iord_str *)ha->pscratch;        if (piord == NULL)            goto stop_output;        length = piord->size;        memcpy(buffer+len, (char *)piord, length);        gdth_ioctl_free(hanum, ha->pscratch);        len = length;     }stop_output:#if LINUX_VERSION_CODE >= 0x020322    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);}static void gdth_do_cmd(Scsi_Cmnd *scp, gdth_cmd_str *gdtcmd,                         char *cmnd, int timeout){    unsigned bufflen;#if LINUX_VERSION_CODE >= 0x020407    DECLARE_COMPLETION(wait);#elif LINUX_VERSION_CODE >= 0x020322    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;    }    scp->request.rq_status = RQ_SCSI_BUSY;#if LINUX_VERSION_CODE >= 0x020407    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 >= 0x020322    scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);#else    GDTH_LOCK_SCSI_DOCMD();    scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);    GDTH_UNLOCK_SCSI_DOCMD();#endif    down(&sem);#endif}void gdth_scsi_done(Scsi_Cmnd *scp){    TRACE2(("gdth_scsi_done()\n"));    scp->request.rq_status = RQ_SCSI_DONE;#if LINUX_VERSION_CODE >= 0x020407    if (scp->request.waiting != NULL)        complete(scp->request.waiting);#else    if (scp->request.sem != NULL)        up(scp->request.sem);#endif}static char *gdth_ioctl_alloc(int hanum, ushort size, int scratch){    gdth_ha_str *ha;    ulong flags;    char *ret_val;    if (size == 0 || size > GDTH_SCRATCH)        return FALSE;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    if (scratch) {         if (!ha->scratch_busy) {            ha->scratch_busy = TRUE;            ret_val = ha->pscratch;        } else            ret_val = NULL;    } else {#if LINUX_VERSION_CODE >= 0x020322        ret_val = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA,                                             GDTH_SCRATCH_ORD);#else        ret_val = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);#endif    }    GDTH_UNLOCK_HA(ha, flags);    return ret_val;}static void gdth_ioctl_free(int hanum, char *buf){    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 >= 0x020322        free_pages((unsigned long)buf, GDTH_SCRATCH_ORD);#else        scsi_init_free((void *)buf, GDTH_SCRATCH);#endif    }    GDTH_UNLOCK_HA(ha, flags);}static 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;}static void gdth_wait_completion(int hanum, int busnum, int id){    gdth_ha_str *ha;    ulong flags;    int i;    Scsi_Cmnd *scp;    unchar b;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (i = 0; i < GDTH_MAXCMDS; ++i) {        scp = ha->cmd_tab[i].cmnd;        b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel;        if (!SPECIAL_SCP(scp) && scp->target == (unchar)id &&             b == (unchar)busnum) {            scp->SCp.have_data_in = 0;            GDTH_UNLOCK_HA(ha, flags);            while (!scp->SCp.have_data_in)                barrier();            GDTH_LOCK_SCSI_DONE(flags);            scp->scsi_done(scp);            GDTH_UNLOCK_SCSI_DONE(flags);        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;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {        b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel;        if (scp->target == (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;    ha = HADATA(gdth_ctr_tab[hanum]);    GDTH_LOCK_HA(ha, flags);    for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {        b = virt_ctr ? NUMDATA(scp->host)->busnum : scp->channel;        if (scp->target == (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 LINUX_VERSION_CODE >= 0x02014B    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);    }#else    if (timeout > 0) {        if (timer_table[SCSI_TIMER].expires == 0) {            timer_table[SCSI_TIMER].expires = jiffies + timeout;            timer_active |= 1 << SCSI_TIMER;        } else {            if (jiffies + timeout < timer_table[SCSI_TIMER].expires)                timer_table[SCSI_TIMER].expires = jiffies + timeout;        }    }#endif    return oldto;}

⌨️ 快捷键说明

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