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 + -
显示快捷键?