00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include<ssdef.h>
00012 #include<misc.h>
00013 #include<crbdef.h>
00014 #include<dyndef.h>
00015
00016 #include<linux/vmalloc.h>
00017 #include<ucbdef.h>
00018 #include<ddbdef.h>
00019 #include<ssdef.h>
00020 #include <ioc_routines.h>
00021 #include <queue.h>
00022 #include <linux/slab.h>
00023
00024
00025
00026
00027
00028 int ioc_std_link_ucb (struct _ucb *ucb) {
00029 struct _ucb * u = ucb;
00030 struct _ucb * next=u->ucb_l_ddb->ddb$ps_ucb;
00031 struct _ucb * prev;
00032 again:
00033 prev=next;
00034 next=prev->ucb_l_link;
00035 if (next==0) goto notagain;
00036 if (next->ucb_w_unit<u->ucb$w_unit) goto again;
00037 if (next->ucb_w_unit==u->ucb$w_unit) return SS$_OPINCOMPL;
00038 notagain:
00039
00040 prev->ucb_l_link=u;
00041 u->ucb_l_link=next;
00042
00043 u->ucb_l_crb->crb$l_refc++;
00044
00045 return SS__NORMAL;
00046 }
00047
00048
00049
00050
00051
00052
00053
00054 int ioc_std_copy_ucb (struct _ucb *src_ucb, struct _ucb **new_ucb) {
00055 int status;
00056 struct _ucb * u;
00057 int size;
00058
00059 if (src_ucb->ucb_w_size) {
00060 size=src_ucb->ucb_w_size;
00061 } else {
00062 size=sizeof(struct _ucb);
00063 printk("ucb %x size zero\n");
00064 }
00065 u=kmalloc(size,GFP_KERNEL);
00066 memcpy(u,src_ucb,size);
00067
00068 qhead_init(&u->ucb_l_fqfl);
00069 u->ucb_l_fr3=0;
00070 u->ucb_l_fr4=0;
00071 u->ucb_l_fpc=0;
00072 u->ucb_w_bufquo=0;
00073
00074 qhead_init(&u->ucb_l_ioqfl);
00075 u->ucb_l_devsts=0;
00076 u->ucb_l_opcnt=0;
00077 u->ucb_l_svapte=0;
00078 u->ucb_l_boff=0;
00079 u->ucb_l_bcnt=0;
00080
00081
00082 u->ucb_l_refc=1;
00083
00084 u->ucb_l_sts|=UCB$M_ONLINE;
00085
00086 u->ucb_l_sts&=~UCB$M_TEMPLATE;
00087
00088 qhead_init(&u->ucb_l_mb_msgqfl);
00089
00090 *new_ucb = u;
00091 return SS__NORMAL;
00092 };
00093
00094 int ioc_std_create_ucb (struct _pcb *pcb, struct _ucb *ucb, struct _ucb **new_ucb_p) {
00095 int status;
00096
00097
00098 status=ioc_std_clone_ucb (ucb, new_ucb_p);
00099 return SS__NORMAL;
00100 }
00101
00102
00103
00104
00105
00106
00107
00108 int ioc_std_clone_ucb (struct _ucb *tmpl_ucb, struct _ucb **new_ucb) {
00109 int status;
00110 struct _ucb * u;
00111 status=ioc_std_copy_ucb(tmpl_ucb,new_ucb);
00112 u=*new_ucb;
00113
00114 u->ucb_w_unit=tmpl_ucb->ucb$w_unit_seed;
00115
00116
00117 again:
00118 if (++tmpl_ucb->ucb_w_unit_seed>9999) tmpl_ucb->ucb$w_unit_seed=0;
00119
00120 status=ioc_std_link_ucb(u);
00121 if (status!=SS__NORMAL) goto again;
00122
00123 return SS__NORMAL;
00124 }
00125
00126 int init_ddb(struct _ddb * ddb, struct _ddt * ddt, struct _ucb * ucb, char * sddb) {
00127 memset(ddb,0,sizeof(struct _ddb));
00128 ddb->ddb_b_type=DYN$C_DDB;
00129 ddb->ddb_l_ddt=ddt;
00130 ddb->ddb_ps_ucb=ucb;
00131 ddb->ddb_t_name[0]=strlen(sddb);
00132 memcpy(&ddb->ddb_t_name[1],sddb,ddb->ddb$t_name[0]);
00133 return SS__NORMAL;
00134 }
00135
00136 int init_ucb(struct _ucb * ucb, struct _ddb * ddb,struct _ddt * ddt, struct _crb *crb) {
00137 ucb->ucb_b_type=DYN$C_UCB;
00138 ucb->ucb_l_ddb=ddb;
00139 ucb->ucb_l_crb=crb;
00140 ucb->ucb_l_ddt=ddt;
00141
00142 ucb->ucb_l_sts|=UCB$M_TEMPLATE;
00143
00144 ucb->ucb_w_unit=9999;
00145 ucb->ucb_w_unit_seed=0;
00146
00147 return SS__NORMAL;
00148 }
00149
00150 int init_crb(struct _crb * crb) {
00151 crb->crb_b_type=DYN$C_CRB;
00152 return SS__NORMAL;
00153 }
00154
00155
00156
00157 int ioc_std_copy_mscp_ucb (struct _ucb *src_ucb, struct _ucb **new_ucb) {
00158 int status;
00159 struct _ucb * u=kmalloc(sizeof(struct _mscp_ucb),GFP_KERNEL);
00160 memcpy(u,src_ucb,sizeof(struct _mscp_ucb));
00161
00162 qhead_init(&u->ucb_l_fqfl);
00163 u->ucb_l_fr3=0;
00164 u->ucb_l_fr4=0;
00165 u->ucb_l_fpc=0;
00166 u->ucb_w_bufquo=0;
00167
00168 qhead_init(&u->ucb_l_ioqfl);
00169 u->ucb_l_devsts=0;
00170 u->ucb_l_opcnt=0;
00171 u->ucb_l_svapte=0;
00172 u->ucb_l_boff=0;
00173 u->ucb_l_bcnt=0;
00174
00175 u->ucb_l_refc=1;
00176 u->ucb_l_sts|=UCB$M_ONLINE;
00177 u->ucb_l_sts&=~UCB$M_TEMPLATE;
00178
00179 qhead_init(&u->ucb_l_mb_msgqfl);
00180
00181 *new_ucb = u;
00182 return SS__NORMAL;
00183 };
00184
00185 int ioc_std_clone_mscp_ucb (struct _ucb *tmpl_ucb, struct _ucb **new_ucb) {
00186 int status;
00187 struct _ucb * u;
00188 status=ioc_std_copy_mscp_ucb(tmpl_ucb,new_ucb);
00189 u=*new_ucb;
00190
00191 u->ucb_w_unit=tmpl_ucb->ucb$w_unit_seed;
00192
00193 again:
00194 if (++tmpl_ucb->ucb_w_unit_seed>9999) tmpl_ucb->ucb$w_unit_seed=0;
00195 status=ioc_std_link_ucb(u);
00196 if (status!=SS__NORMAL) goto again;
00197
00198 ((struct _mscp_ucb *)u)->ucb_w_mscpunit=u->ucb$w_unit;
00199
00200 return SS__NORMAL;
00201 }
00202
00203 int ioc_delete_ucb() {
00204 printk("IOC_DELETE_UCB not impl\n");
00205 }
00206