1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * ioctl interface for the scsi media changer driver 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _UAPI_LINUX_CHIO_H 7*4882a593Smuzhiyun #define _UAPI_LINUX_CHIO_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* changer element types */ 10*4882a593Smuzhiyun #define CHET_MT 0 /* media transport element (robot) */ 11*4882a593Smuzhiyun #define CHET_ST 1 /* storage element (media slots) */ 12*4882a593Smuzhiyun #define CHET_IE 2 /* import/export element */ 13*4882a593Smuzhiyun #define CHET_DT 3 /* data transfer element (tape/cdrom/whatever) */ 14*4882a593Smuzhiyun #define CHET_V1 4 /* vendor specific #1 */ 15*4882a593Smuzhiyun #define CHET_V2 5 /* vendor specific #2 */ 16*4882a593Smuzhiyun #define CHET_V3 6 /* vendor specific #3 */ 17*4882a593Smuzhiyun #define CHET_V4 7 /* vendor specific #4 */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* 21*4882a593Smuzhiyun * CHIOGPARAMS 22*4882a593Smuzhiyun * query changer properties 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * CHIOVGPARAMS 25*4882a593Smuzhiyun * query vendor-specific element types 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * accessing elements works by specifing type and unit of the element. 28*4882a593Smuzhiyun * for example, storage elements are addressed with type = CHET_ST and 29*4882a593Smuzhiyun * unit = 0 .. cp_nslots-1 30*4882a593Smuzhiyun * 31*4882a593Smuzhiyun */ 32*4882a593Smuzhiyun struct changer_params { 33*4882a593Smuzhiyun int cp_curpicker; /* current transport element */ 34*4882a593Smuzhiyun int cp_npickers; /* number of transport elements (CHET_MT) */ 35*4882a593Smuzhiyun int cp_nslots; /* number of storage elements (CHET_ST) */ 36*4882a593Smuzhiyun int cp_nportals; /* number of import/export elements (CHET_IE) */ 37*4882a593Smuzhiyun int cp_ndrives; /* number of data transfer elements (CHET_DT) */ 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun struct changer_vendor_params { 40*4882a593Smuzhiyun int cvp_n1; /* number of vendor specific elems (CHET_V1) */ 41*4882a593Smuzhiyun char cvp_label1[16]; 42*4882a593Smuzhiyun int cvp_n2; /* number of vendor specific elems (CHET_V2) */ 43*4882a593Smuzhiyun char cvp_label2[16]; 44*4882a593Smuzhiyun int cvp_n3; /* number of vendor specific elems (CHET_V3) */ 45*4882a593Smuzhiyun char cvp_label3[16]; 46*4882a593Smuzhiyun int cvp_n4; /* number of vendor specific elems (CHET_V4) */ 47*4882a593Smuzhiyun char cvp_label4[16]; 48*4882a593Smuzhiyun int reserved[8]; 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* 53*4882a593Smuzhiyun * CHIOMOVE 54*4882a593Smuzhiyun * move a medium from one element to another 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun struct changer_move { 57*4882a593Smuzhiyun int cm_fromtype; /* type/unit of source element */ 58*4882a593Smuzhiyun int cm_fromunit; 59*4882a593Smuzhiyun int cm_totype; /* type/unit of destination element */ 60*4882a593Smuzhiyun int cm_tounit; 61*4882a593Smuzhiyun int cm_flags; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun #define CM_INVERT 1 /* flag: rotate media (for double-sided like MOD) */ 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* 67*4882a593Smuzhiyun * CHIOEXCHANGE 68*4882a593Smuzhiyun * move one medium from element #1 to element #2, 69*4882a593Smuzhiyun * and another one from element #2 to element #3. 70*4882a593Smuzhiyun * element #1 and #3 are allowed to be identical. 71*4882a593Smuzhiyun */ 72*4882a593Smuzhiyun struct changer_exchange { 73*4882a593Smuzhiyun int ce_srctype; /* type/unit of element #1 */ 74*4882a593Smuzhiyun int ce_srcunit; 75*4882a593Smuzhiyun int ce_fdsttype; /* type/unit of element #2 */ 76*4882a593Smuzhiyun int ce_fdstunit; 77*4882a593Smuzhiyun int ce_sdsttype; /* type/unit of element #3 */ 78*4882a593Smuzhiyun int ce_sdstunit; 79*4882a593Smuzhiyun int ce_flags; 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun #define CE_INVERT1 1 82*4882a593Smuzhiyun #define CE_INVERT2 2 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* 86*4882a593Smuzhiyun * CHIOPOSITION 87*4882a593Smuzhiyun * move the transport element (robot arm) to a specific element. 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun struct changer_position { 90*4882a593Smuzhiyun int cp_type; 91*4882a593Smuzhiyun int cp_unit; 92*4882a593Smuzhiyun int cp_flags; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun #define CP_INVERT 1 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* 98*4882a593Smuzhiyun * CHIOGSTATUS 99*4882a593Smuzhiyun * get element status for all elements of a specific type 100*4882a593Smuzhiyun */ 101*4882a593Smuzhiyun struct changer_element_status { 102*4882a593Smuzhiyun int ces_type; 103*4882a593Smuzhiyun unsigned char __user *ces_data; 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun #define CESTATUS_FULL 0x01 /* full */ 106*4882a593Smuzhiyun #define CESTATUS_IMPEXP 0x02 /* media was imported (inserted by sysop) */ 107*4882a593Smuzhiyun #define CESTATUS_EXCEPT 0x04 /* error condition */ 108*4882a593Smuzhiyun #define CESTATUS_ACCESS 0x08 /* access allowed */ 109*4882a593Smuzhiyun #define CESTATUS_EXENAB 0x10 /* element can export media */ 110*4882a593Smuzhiyun #define CESTATUS_INENAB 0x20 /* element can import media */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* 114*4882a593Smuzhiyun * CHIOGELEM 115*4882a593Smuzhiyun * get more detailed status information for a single element 116*4882a593Smuzhiyun */ 117*4882a593Smuzhiyun struct changer_get_element { 118*4882a593Smuzhiyun int cge_type; /* type/unit */ 119*4882a593Smuzhiyun int cge_unit; 120*4882a593Smuzhiyun int cge_status; /* status */ 121*4882a593Smuzhiyun int cge_errno; /* errno */ 122*4882a593Smuzhiyun int cge_srctype; /* source element of the last move/exchange */ 123*4882a593Smuzhiyun int cge_srcunit; 124*4882a593Smuzhiyun int cge_id; /* scsi id (for data transfer elements) */ 125*4882a593Smuzhiyun int cge_lun; /* scsi lun (for data transfer elements) */ 126*4882a593Smuzhiyun char cge_pvoltag[36]; /* primary volume tag */ 127*4882a593Smuzhiyun char cge_avoltag[36]; /* alternate volume tag */ 128*4882a593Smuzhiyun int cge_flags; 129*4882a593Smuzhiyun }; 130*4882a593Smuzhiyun /* flags */ 131*4882a593Smuzhiyun #define CGE_ERRNO 0x01 /* errno available */ 132*4882a593Smuzhiyun #define CGE_INVERT 0x02 /* media inverted */ 133*4882a593Smuzhiyun #define CGE_SRC 0x04 /* media src available */ 134*4882a593Smuzhiyun #define CGE_IDLUN 0x08 /* ID+LUN available */ 135*4882a593Smuzhiyun #define CGE_PVOLTAG 0x10 /* primary volume tag available */ 136*4882a593Smuzhiyun #define CGE_AVOLTAG 0x20 /* alternate volume tag available */ 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* 140*4882a593Smuzhiyun * CHIOSVOLTAG 141*4882a593Smuzhiyun * set volume tag 142*4882a593Smuzhiyun */ 143*4882a593Smuzhiyun struct changer_set_voltag { 144*4882a593Smuzhiyun int csv_type; /* type/unit */ 145*4882a593Smuzhiyun int csv_unit; 146*4882a593Smuzhiyun char csv_voltag[36]; /* volume tag */ 147*4882a593Smuzhiyun int csv_flags; 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun #define CSV_PVOLTAG 0x01 /* primary volume tag */ 150*4882a593Smuzhiyun #define CSV_AVOLTAG 0x02 /* alternate volume tag */ 151*4882a593Smuzhiyun #define CSV_CLEARTAG 0x04 /* clear volume tag */ 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun /* ioctls */ 154*4882a593Smuzhiyun #define CHIOMOVE _IOW('c', 1,struct changer_move) 155*4882a593Smuzhiyun #define CHIOEXCHANGE _IOW('c', 2,struct changer_exchange) 156*4882a593Smuzhiyun #define CHIOPOSITION _IOW('c', 3,struct changer_position) 157*4882a593Smuzhiyun #define CHIOGPICKER _IOR('c', 4,int) /* not impl. */ 158*4882a593Smuzhiyun #define CHIOSPICKER _IOW('c', 5,int) /* not impl. */ 159*4882a593Smuzhiyun #define CHIOGPARAMS _IOR('c', 6,struct changer_params) 160*4882a593Smuzhiyun #define CHIOGSTATUS _IOW('c', 8,struct changer_element_status) 161*4882a593Smuzhiyun #define CHIOGELEM _IOW('c',16,struct changer_get_element) 162*4882a593Smuzhiyun #define CHIOINITELEM _IO('c',17) 163*4882a593Smuzhiyun #define CHIOSVOLTAG _IOW('c',18,struct changer_set_voltag) 164*4882a593Smuzhiyun #define CHIOGVPARAMS _IOR('c',19,struct changer_vendor_params) 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun #endif /* _UAPI_LINUX_CHIO_H */ 167