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; }