/* These are used to simplify getting data in from and back to user land */
#define IOCTL_IN(arg, type, in) \
- if (copy_from_user(&(in), (type *) (arg), sizeof (in))) \
+ if (copy_from_user(&(in), (type __user *) (arg), sizeof (in))) \
return -EFAULT;
#define IOCTL_OUT(arg, type, out) \
- if (copy_to_user((type *) (arg), &(out), sizeof (out))) \
+ if (copy_to_user((type __user *) (arg), &(out), sizeof (out))) \
return -EFAULT;
/* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in
int cdrom_get_media_event(struct cdrom_device_info *cdi,
struct media_event_desc *med)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
unsigned char buffer[8];
struct event_header *eh = (struct event_header *) buffer;
*/
int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
char buffer[16];
init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct mrw_feature_desc *mfd;
unsigned char buffer[16];
int ret;
+ *write = 0;
+
init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)];
*write = mfd->write;
- if ((ret = cdrom_mrw_probe_pc(cdi)))
+ if ((ret = cdrom_mrw_probe_pc(cdi))) {
+ *write = 0;
return ret;
+ }
return 0;
}
static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
unsigned char buffer[12];
int ret;
static int cdrom_mrw_bgformat_susp(struct cdrom_device_info *cdi, int immed)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
cgc.cmd[0] = GPCMD_CLOSE_TRACK;
static int cdrom_flush_cache(struct cdrom_device_info *cdi)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
cgc.cmd[0] = GPCMD_FLUSH_CACHE;
static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct mode_page_header *mph;
char buffer[16];
int ret, offset, size;
int cdrom_get_random_writable(struct cdrom_device_info *cdi,
struct rwrt_feature_desc *rfd)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
char buffer[24];
- struct feature_header *fh;
int ret;
init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
return ret;
- fh = (struct feature_header *)&buffer[0];
- if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+
- sizeof(struct rwrt_feature_desc)))
- memcpy(rfd, &buffer[sizeof(struct feature_header)],
- sizeof (*rfd));
- else
- memset(rfd, 0, sizeof(*rfd));
-
+ memcpy(rfd, &buffer[sizeof(struct feature_header)], sizeof (*rfd));
return 0;
}
int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
char buffer[16];
- struct feature_header *fh;
__u16 *feature_code;
int ret;
init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
- cgc.cmd[0] = GPCMD_GET_CONFIGURATION; /* often 0x46 */
- cgc.cmd[3] = CDF_HWDM; /* often 0x0024 */
- cgc.cmd[8] = sizeof(buffer); /* often 0x10 */
+ cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
+ cgc.cmd[3] = CDF_HWDM;
+ cgc.cmd[8] = sizeof(buffer);
cgc.quiet = 1;
if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
return ret;
- fh = (struct feature_header *)&buffer[0];
- ret = 1;
- if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+8)) {
- feature_code = (__u16 *)&buffer[sizeof(struct feature_header)];
- if (CDF_HWDM == be16_to_cpu(*feature_code))
- ret = 0;
- }
- return ret;
+ feature_code = (__u16 *) &buffer[sizeof(struct feature_header)];
+ if (be16_to_cpu(*feature_code) == CDF_HWDM)
+ return 0;
+
+ return 1;
}
static int mo_open_write(struct cdrom_device_info *cdi)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
char buffer[255];
int ret;
*/
static int cdrom_open_write(struct cdrom_device_info *cdi)
{
+ int mrw, mrw_write, ram_write;
int ret = 1;
+ mrw = 0;
+ if (!cdrom_is_mrw(cdi, &mrw_write))
+ mrw = 1;
+
+ (void) cdrom_is_random_writable(cdi, &ram_write);
+
+ if (mrw)
+ cdi->mask &= ~CDC_MRW;
+ else
+ cdi->mask |= CDC_MRW;
+
+ if (mrw_write)
+ cdi->mask &= ~CDC_MRW_W;
+ else
+ cdi->mask |= CDC_MRW_W;
+
+ if (ram_write)
+ cdi->mask &= ~CDC_RAM;
+ else
+ cdi->mask |= CDC_RAM;
+
if (CDROM_CAN(CDC_MRW_W))
ret = cdrom_mrw_open_write(cdi);
else if (CDROM_CAN(CDC_DVD_RAM))
if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) {
ret = cdi->ops->open(cdi, 1);
} else {
+ ret = open_for_data(cdi);
+ if (ret)
+ goto err;
if (fp->f_mode & FMODE_WRITE) {
ret = -EROFS;
if (!CDROM_CAN(CDC_RAM))
if (cdrom_open_write(cdi))
goto err;
}
- ret = open_for_data(cdi);
}
if (ret)
static int cdrom_read_mech_status(struct cdrom_device_info *cdi,
struct cdrom_changer_info *buf)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct cdrom_device_ops *cdo = cdi->ops;
int length;
/* If SLOT < 0, unload the current slot. Otherwise, try to load SLOT. */
static int cdrom_load_unload(struct cdrom_device_info *cdi, int slot)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
cdinfo(CD_CHANGER, "entering cdrom_load_unload()\n");
if (cdi->sanyo_slot && slot < 0)
*curr = requested;
}
-void init_cdrom_command(struct cdrom_generic_command *cgc, void *buf, int len,
+void init_cdrom_command(struct packet_command *cgc, void *buf, int len,
int type)
{
- memset(cgc, 0, sizeof(struct cdrom_generic_command));
+ memset(cgc, 0, sizeof(struct packet_command));
if (buf)
memset(buf, 0, len);
cgc->buffer = (char *) buf;
#define copy_key(dest,src) memcpy((dest), (src), sizeof(dvd_key))
#define copy_chal(dest,src) memcpy((dest), (src), sizeof(dvd_challenge))
-static void setup_report_key(struct cdrom_generic_command *cgc, unsigned agid, unsigned type)
+static void setup_report_key(struct packet_command *cgc, unsigned agid, unsigned type)
{
cgc->cmd[0] = GPCMD_REPORT_KEY;
cgc->cmd[10] = type | (agid << 6);
cgc->data_direction = CGC_DATA_READ;
}
-static void setup_send_key(struct cdrom_generic_command *cgc, unsigned agid, unsigned type)
+static void setup_send_key(struct packet_command *cgc, unsigned agid, unsigned type)
{
cgc->cmd[0] = GPCMD_SEND_KEY;
cgc->cmd[10] = type | (agid << 6);
{
int ret;
u_char buf[20];
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct cdrom_device_ops *cdo = cdi->ops;
rpc_state_t rpc_state;
{
unsigned char buf[21], *base;
struct dvd_layer *layer;
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct cdrom_device_ops *cdo = cdi->ops;
int ret, layer_num = s->physical.layer_num;
{
int ret;
u_char buf[8];
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct cdrom_device_ops *cdo = cdi->ops;
init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
{
int ret, size;
u_char *buf;
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct cdrom_device_ops *cdo = cdi->ops;
size = sizeof(s->disckey.value) + 4;
{
int ret;
u_char buf[4 + 188];
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct cdrom_device_ops *cdo = cdi->ops;
init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
{
int ret = 0, size;
u_char *buf;
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct cdrom_device_ops *cdo = cdi->ops;
size = sizeof(s->manufact.value) + 4;
}
int cdrom_mode_sense(struct cdrom_device_info *cdi,
- struct cdrom_generic_command *cgc,
+ struct packet_command *cgc,
int page_code, int page_control)
{
struct cdrom_device_ops *cdo = cdi->ops;
}
int cdrom_mode_select(struct cdrom_device_info *cdi,
- struct cdrom_generic_command *cgc)
+ struct packet_command *cgc)
{
struct cdrom_device_ops *cdo = cdi->ops;
struct cdrom_subchnl *subchnl, int mcn)
{
struct cdrom_device_ops *cdo = cdi->ops;
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
char buffer[32];
int ret;
* Specific READ_10 interface
*/
static int cdrom_read_cd(struct cdrom_device_info *cdi,
- struct cdrom_generic_command *cgc, int lba,
+ struct packet_command *cgc, int lba,
int blocksize, int nblocks)
{
struct cdrom_device_ops *cdo = cdi->ops;
/* very generic interface for reading the various types of blocks */
static int cdrom_read_block(struct cdrom_device_info *cdi,
- struct cdrom_generic_command *cgc,
+ struct packet_command *cgc,
int lba, int nblocks, int format, int blksize)
{
struct cdrom_device_ops *cdo = cdi->ops;
static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf,
int lba, int nframes)
{
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
int nr, ret;
memset(&cgc, 0, sizeof(cgc));
int ret;
/* Try the generic SCSI command ioctl's first.. */
- ret = scsi_cmd_ioctl(ip->i_bdev->bd_disk, cmd, arg);
+ ret = scsi_cmd_ioctl(ip->i_bdev->bd_disk, cmd, (void __user *)arg);
if (ret != -ENOTTY)
return ret;
static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size)
{
struct cdrom_device_ops *cdo = cdi->ops;
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct modesel_head mh;
memset(&mh, 0, sizeof(mh));
unsigned long arg)
{
struct cdrom_device_ops *cdo = cdi->ops;
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
struct request_sense sense;
char buffer[32];
int ret = 0;
ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1);
ret |= cdrom_switch_blocksize(cdi, blocksize);
}
- if (!ret && copy_to_user((char *)arg, cgc.buffer, blocksize))
+ if (!ret && copy_to_user((char __user *)arg, cgc.buffer, blocksize))
ret = -EFAULT;
kfree(cgc.buffer);
return ret;
if ((s = (dvd_struct *) kmalloc(size, GFP_KERNEL)) == NULL)
return -ENOMEM;
cdinfo(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n");
- if (copy_from_user(s, (dvd_struct *)arg, size)) {
+ if (copy_from_user(s, (dvd_struct __user *)arg, size)) {
kfree(s);
return -EFAULT;
}
kfree(s);
return ret;
}
- if (copy_to_user((dvd_struct *)arg, s, size))
+ if (copy_to_user((dvd_struct __user *)arg, s, size))
ret = -EFAULT;
kfree(s);
return ret;
track_information *ti)
{
struct cdrom_device_ops *cdo = cdi->ops;
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
int ret;
init_cdrom_command(&cgc, ti, 8, CGC_DATA_READ);
static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di)
{
struct cdrom_device_ops *cdo = cdi->ops;
- struct cdrom_generic_command cgc;
+ struct packet_command cgc;
int ret;
/* set up command and get the disc info */
} cdrom_sysctl_settings;
int cdrom_sysctl_info(ctl_table *ctl, int write, struct file * filp,
- void *buffer, size_t *lenp)
+ void __user *buffer, size_t *lenp)
{
int pos;
struct cdrom_device_info *cdi;
}
static int cdrom_sysctl_handler(ctl_table *ctl, int write, struct file * filp,
- void *buffer, size_t *lenp)
+ void __user *buffer, size_t *lenp)
{
int *valp = ctl->data;
int val = *valp;