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

📄 claw.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
        }#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 + -