📄 claw.c
字号:
}#endif#ifdef FUNCTRACE printk(KERN_INFO "%s:%s Exit on line %d\n", dev->name,__FUNCTION__,__LINE__);#endif CLAW_DBF_TEXT(4,trace,"addexit"); return 0;} /* end of add_claw_reads *//*-------------------------------------------------------------------* * ccw_check_return_code * * * *-------------------------------------------------------------------*/static void inlineccw_check_return_code(struct ccw_device *cdev, int return_code){#ifdef FUNCTRACE printk(KERN_INFO "%s: %s() > enter \n", cdev->dev.bus_id,__FUNCTION__);#endif CLAW_DBF_TEXT(4,trace,"ccwret");#ifdef DEBUGMSG printk(KERN_INFO "variable cdev =\n"); dumpit((char *) cdev, sizeof(struct ccw_device)); printk(KERN_INFO "variable return_code = %d\n",return_code);#endif if (return_code != 0) { switch (return_code) { case -EBUSY: printk(KERN_INFO "%s: Busy !\n", cdev->dev.bus_id); break; case -ENODEV: printk(KERN_EMERG "%s: Missing device called " "for IO ENODEV\n", cdev->dev.bus_id); break; case -EIO: printk(KERN_EMERG "%s: Status pending... EIO \n", cdev->dev.bus_id); break; case -EINVAL: printk(KERN_EMERG "%s: Invalid Dev State EINVAL \n", cdev->dev.bus_id); break; default: printk(KERN_EMERG "%s: Unknown error in " "Do_IO %d\n",cdev->dev.bus_id, return_code); } }#ifdef FUNCTRACE printk(KERN_INFO "%s: %s() > exit on line %d\n", cdev->dev.bus_id,__FUNCTION__,__LINE__);#endif CLAW_DBF_TEXT(4,trace,"ccwret");} /* end of ccw_check_return_code *//*-------------------------------------------------------------------** ccw_check_unit_check **--------------------------------------------------------------------*/static void inlineccw_check_unit_check(struct chbk * p_ch, unsigned char sense ){ struct net_device *dev = p_ch->ndev;#ifdef FUNCTRACE printk(KERN_INFO "%s: %s() > enter\n",dev->name,__FUNCTION__);#endif#ifdef DEBUGMSG printk(KERN_INFO "%s: variable dev =\n",dev->name); dumpit((char *)dev, sizeof(struct net_device)); printk(KERN_INFO "%s: variable sense =\n",dev->name); dumpit((char *)&sense, 2);#endif CLAW_DBF_TEXT(4,trace,"unitchek"); printk(KERN_INFO "%s: Unit Check with sense byte:0x%04x\n", dev->name, sense); if (sense & 0x40) { if (sense & 0x01) { printk(KERN_WARNING "%s: Interface disconnect or " "Selective reset " "occurred (remote side)\n", dev->name); } else { printk(KERN_WARNING "%s: System reset occured" " (remote side)\n", dev->name); } } else if (sense & 0x20) { if (sense & 0x04) { printk(KERN_WARNING "%s: Data-streaming " "timeout)\n", dev->name); } else { printk(KERN_WARNING "%s: Data-transfer parity" " error\n", dev->name); } } else if (sense & 0x10) { if (sense & 0x20) { printk(KERN_WARNING "%s: Hardware malfunction " "(remote side)\n", dev->name); } else { printk(KERN_WARNING "%s: read-data parity error " "(remote side)\n", dev->name); } }#ifdef FUNCTRACE printk(KERN_INFO "%s: %s() exit on line %d\n", dev->name,__FUNCTION__,__LINE__);#endif} /* end of ccw_check_unit_check *//*-------------------------------------------------------------------** Dump buffer format ** **--------------------------------------------------------------------*/#ifdef DEBUGstatic voiddumpit(char* buf, int len){ __u32 ct, sw, rm, dup; char *ptr, *rptr; char tbuf[82], tdup[82];#if (CONFIG_ARCH_S390X) char addr[22];#else char addr[12];#endif char boff[12]; char bhex[82], duphex[82]; char basc[40]; sw = 0; rptr =ptr=buf; rm = 16; duphex[0] = 0x00; dup = 0; for ( ct=0; ct < len; ct++, ptr++, rptr++ ) { if (sw == 0) {#if (CONFIG_ARCH_S390X) sprintf(addr, "%16.16lX",(unsigned long)rptr);#else sprintf(addr, "%8.8X",(__u32)rptr);#endif sprintf(boff, "%4.4X", (__u32)ct); bhex[0] = '\0'; basc[0] = '\0'; } if ((sw == 4) || (sw == 12)) { strcat(bhex, " "); } if (sw == 8) { strcat(bhex, " "); }#if (CONFIG_ARCH_S390X) sprintf(tbuf,"%2.2lX", (unsigned long)*ptr);#else sprintf(tbuf,"%2.2X", (__u32)*ptr);#endif tbuf[2] = '\0'; strcat(bhex, tbuf); if ((0!=isprint(*ptr)) && (*ptr >= 0x20)) { basc[sw] = *ptr; } else { basc[sw] = '.'; } basc[sw+1] = '\0'; sw++; rm--; if (sw==16) { if ((strcmp(duphex, bhex)) !=0) { if (dup !=0) { sprintf(tdup,"Duplicate as above to" " %s", addr); printk( KERN_INFO " " " --- %s ---\n",tdup); } printk( KERN_INFO " %s (+%s) : %s [%s]\n", addr, boff, bhex, basc); dup = 0; strcpy(duphex, bhex); } else { dup++; } sw = 0; rm = 16; } } /* endfor */ if (sw != 0) { for ( ; rm > 0; rm--, sw++ ) { if ((sw==4) || (sw==12)) strcat(bhex, " "); if (sw==8) strcat(bhex, " "); strcat(bhex, " "); strcat(basc, " "); } if (dup !=0) { sprintf(tdup,"Duplicate as above to %s", addr); printk( KERN_INFO " --- %s ---\n", tdup); } printk( KERN_INFO " %s (+%s) : %s [%s]\n", addr, boff, bhex, basc); } else { if (dup >=1) { sprintf(tdup,"Duplicate as above to %s", addr); printk( KERN_INFO " --- %s ---\n", tdup); } if (dup !=0) { printk( KERN_INFO " %s (+%s) : %s [%s]\n", addr, boff, bhex, basc); } } return;} /* end of dumpit */#endif/*-------------------------------------------------------------------** find_link **--------------------------------------------------------------------*/static intfind_link(struct net_device *dev, char *host_name, char *ws_name ){ struct claw_privbk *privptr; struct claw_env *p_env; int rc=0;#ifdef FUNCTRACE printk(KERN_INFO "%s:%s > enter \n",dev->name,__FUNCTION__);#endif CLAW_DBF_TEXT(2,setup,"findlink");#ifdef DEBUGMSG printk(KERN_INFO "%s: variable dev = \n",dev->name); dumpit((char *) dev, sizeof(struct net_device)); printk(KERN_INFO "%s: variable host_name = %s\n",dev->name, host_name); printk(KERN_INFO "%s: variable ws_name = %s\n",dev->name, ws_name);#endif privptr=dev->priv; p_env=privptr->p_env; switch (p_env->packing) { case PACKING_ASK: if ((memcmp(WS_APPL_NAME_PACKED, host_name, 8)!=0) || (memcmp(WS_APPL_NAME_PACKED, ws_name, 8)!=0 )) rc = EINVAL; break; case DO_PACKED: case PACK_SEND: if ((memcmp(WS_APPL_NAME_IP_NAME, host_name, 8)!=0) || (memcmp(WS_APPL_NAME_IP_NAME, ws_name, 8)!=0 )) rc = EINVAL; break; default: if ((memcmp(HOST_APPL_NAME, host_name, 8)!=0) || (memcmp(p_env->api_type , ws_name, 8)!=0)) rc = EINVAL; break; }#ifdef FUNCTRACE printk(KERN_INFO "%s:%s Exit on line %d\n", dev->name,__FUNCTION__,__LINE__);#endif return 0;} /* end of find_link *//*-------------------------------------------------------------------* * claw_hw_tx * * * * * *-------------------------------------------------------------------*/static intclaw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid){ int rc=0; struct claw_privbk *privptr; struct ccwbk *p_this_ccw; struct ccwbk *p_first_ccw; struct ccwbk *p_last_ccw; __u32 numBuffers; signed long len_of_data; unsigned long bytesInThisBuffer; unsigned char *pDataAddress; struct endccw *pEnd; struct ccw1 tempCCW; struct chbk *p_ch; struct claw_env *p_env; int lock; struct clawph *pk_head; struct chbk *ch;#ifdef IOTRACE struct ccwbk *p_buf;#endif#ifdef FUNCTRACE printk(KERN_INFO "%s: %s() > enter\n",dev->name,__FUNCTION__);#endif CLAW_DBF_TEXT(4,trace,"hw_tx");#ifdef DEBUGMSG printk(KERN_INFO "%s: variable dev skb =\n",dev->name); dumpit((char *) skb, sizeof(struct sk_buff)); printk(KERN_INFO "%s: variable dev =\n",dev->name); dumpit((char *) dev, sizeof(struct net_device)); printk(KERN_INFO "%s: variable linkid = %ld\n",dev->name,linkid);#endif privptr = (struct claw_privbk *) (dev->priv); p_ch=(struct chbk *)&privptr->channel[WRITE]; p_env =privptr->p_env;#ifdef IOTRACE printk(KERN_INFO "%s: %s() dump sk_buff \n",dev->name,__FUNCTION__); dumpit((char *)skb ,sizeof(struct sk_buff));#endif claw_free_wrt_buf(dev); /* Clean up free chain if posible */ /* scan the write queue to free any completed write packets */ p_first_ccw=NULL; p_last_ccw=NULL; if ((p_env->packing >= PACK_SEND) && (skb->cb[1] != 'P')) { skb_push(skb,sizeof(struct clawph)); pk_head=(struct clawph *)skb->data; pk_head->len=skb->len-sizeof(struct clawph); if (pk_head->len%4) { pk_head->len+= 4-(pk_head->len%4); skb_pad(skb,4-(pk_head->len%4)); skb_put(skb,4-(pk_head->len%4)); } if (p_env->packing == DO_PACKED) pk_head->link_num = linkid; else pk_head->link_num = 0; pk_head->flag = 0x00; skb_pad(skb,4); skb->cb[1] = 'P'; } if (linkid == 0) { if (claw_check_busy(dev)) { if (privptr->write_free_count!=0) { claw_clear_busy(dev); } else { claw_strt_out_IO(dev ); claw_free_wrt_buf( dev ); if (privptr->write_free_count==0) {#ifdef IOTRACE printk(KERN_INFO "%s: " "(claw_check_busy) no free write " "buffers\n", dev->name);#endif ch = &privptr->channel[WRITE]; atomic_inc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -