示例#1
0
ssize_t write_dev(struct file *filp, const char __user *ubuff, size_t size, loff_t *loff)
{
	int no_qs, qun_siz, ret, nocsw, noctw, lv, i;
	struct DEV *lsdev;
	struct Qset *lqset;
	lsdev = filp->private_data;
	//char buff[] = ubuff;
	#ifdef DEBUG
	printk(KERN_INFO "BEGIN.....%s\n", __func__);
	#endif
	//if(!down(&lsdev->sem))
	//	return -ERESTARTSYS;
	
	ret = i = nocsw = 0;
	no_qs = size / (qset_size * quantum_size);/*Calculation of number of struct qset*/
	
	if(size % (qset_size * quantum_size) )
			no_qs++;

	lsdev->qset = create_structqset(no_qs); /*Function for the creation of the struct Qset*/
	
	create_qset(no_qs, lsdev->qset); /*Function for the create of the qset array*/

	qun_siz = size / quantum_size;
	if(size % quantum_size)
		qun_siz++;
	create_quantum(qun_siz, lsdev->qset);/*Function to create the quantum*/
	
	noctw = size;
	lqset = lsdev->qset;
	for(lv = 0; lv < qun_siz; lv++)
	{
		if(noctw > quantum_size)
			noctw = quantum_size;
		ret = copy_from_user(lqset->data[i], ubuff + nocsw, noctw);
		printk(KERN_INFO "nocsw ..%d noctw ..%d  i = %d\n", nocsw, noctw, i);
		#ifdef DEBUG
		printk(KERN_INFO "Wrote on the device is %s\n", (char *)lqset->data[i]);
		#endif
		i++;
		nocsw = nocsw + noctw - ret;
		noctw = size - nocsw; 
		if(i == qset_size)
		{
			/*if(!lqset->next)
			{
				#ifdef DEBUG
				printk(KERN_ERR "Next qset is not present ...%s\n", __func__);
				#endif
				goto OUT;
			}*/
			if(lqset->next != NULL)
			{
				i = 0;
				lqset = lqset->next;
			}
			//else
			//	goto OUT;
		}

	}
	#ifdef DEBUG
	printk(KERN_INFO "END.....%s\n", __func__);
	#endif
                       
	data_size = nocsw;
	lsdev->data_size = nocsw;
	#ifdef DEBUG
	printk(KERN_INFO "._siz....%d\n", data_size);
	#endif
	filp->f_pos = nocsw;
//	up(&lsdev->sem);
	complete(&lsdev->comp);
	return nocsw;
//OUT:
//	data_size = nocsw;
//	return nocsw;
}
ssize_t dev_write(struct file * filep, const char __user *ubuff, size_t count, loff_t * pos)
{
	int noq,nosqs,ret,lv,notb;
	int nobpq=0,loop;
	int nobw=0;
	struct Sculldev *lsculldev;
	struct Scullqset *lscullqset;
	#ifdef DEFINE
	printk(KERN_INFO " begin  : %s\n",__func__);
#endif
	nosqs = noq = 0;
	lsculldev=(struct Sculldev *)filep->private_data;
	lsculldev->wcount=count;
	noq = count/quantum_size;
	if(count % quantum_size)
	noq++;
	#ifdef DEFINE
	printk(KERN_INFO " noq = %d\n",noq);
	#endif
	nosqs = count/(quantum_size * qset_size);
	if(count % (quantum_size * qset_size))
	nosqs++;
	#ifdef DEFINE
	printk(KERN_INFO " nosqs = %d\n",nosqs);
	#endif
	lsculldev->scullqset=create_scullqset(nosqs);
	if(!lsculldev->scullqset)
	{	
		#ifdef DEFINE
		printk(KERN_INFO " create_scullqset faliure\n");
		#endif
	}
	else
	{
		#ifdef DEFINE
		printk(KERN_INFO " create_scullqset successful\n");
		#endif
			
	}
	lscullqset = lsculldev->scullqset;
	ret=create_qset(lscullqset,nosqs );
	if(ret<0)
	{	
		#ifdef DEFINE
		printk(KERN_INFO " create_qset faliure\n");
		#endif
	}
	else
	{
		#ifdef DEFINE
		printk(KERN_INFO " create_qset successful\n");
		#endif
			
	}
	ret=create_quantum(lscullqset,noq);
	if(ret<0)
	{	
		#ifdef DEFINE
		printk(KERN_INFO " create_quantum faliure\n");
		#endif
	}
	else if(ret==noq)
	{
		#ifdef DEFINE
		printk(KERN_INFO " create_quantum successful\n");
		#endif
			
	}
	notb = count;
	while(noq)
	{
		if(noq>quantum_size)
		{
			loop=quantum_size;
		}
		else
		{
			loop=noq;
		}
			for(lv=0;lv<loop;lv++)
			{
				if(notb > quantum_size)
					nobpq=quantum_size;
				else
					nobpq = notb;
				ret=copy_from_user(lscullqset->data[lv],ubuff+nobw,nobpq);
				if(ret==0)
				{
				#ifdef DEFINE
				printk(KERN_INFO " written succesfully %d  %d  %s\n",lv,ret,(char *)lscullqset->data[lv]);
				#endif
				}
				else 
				{
				#ifdef DEFINE
				printk(KERN_INFO " remaining bytes are %d\n",ret);
				#endif
				}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////				  
/*				unsigned long status;
				status=inb(BASE+1);
				if(status==1)
				{
				outb(*((char*)(lscullqset->data[lv])),BASE);
				outb(0,BASE+2);
				}*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				//outb(255,0x0378);
				nobw=nobw+(nobpq-ret);
				notb = notb -(nobpq + ret);
				filep->f_pos = nobw;
				#ifdef DEFINE
				printk(KERN_INFO " file_position = %d\n",(int)filep->f_pos);
				#endif
				
			}
		
		lscullqset=lscullqset->next;
		noq=noq-loop;
		
		#ifdef DEFINE
		printk(KERN_INFO " noq= %d\n",noq);
		#endif
	}
	#ifdef DEFINE
	printk(KERN_INFO " end  : %s\n",__func__);
	#endif
	return nobw;
}