Commit 8b3e8b7a authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] (15/25) sbpcd.c - killed useds of cdi->dev

	sbpcd.c - d eliminated, ditto for uses of cdi->dev (we set cdi->handle
pointing to structure we neeed).  Cleaned up a bit.
parent 3aa5472a
...@@ -480,7 +480,6 @@ static void sbp_read_cmd(struct request *req); ...@@ -480,7 +480,6 @@ static void sbp_read_cmd(struct request *req);
static int sbp_data(struct request *req); static int sbp_data(struct request *req);
static int cmd_out(void); static int cmd_out(void);
static int DiskInfo(void); static int DiskInfo(void);
static int sbpcd_chk_disk_change(kdev_t);
/*==========================================================================*/ /*==========================================================================*/
...@@ -623,8 +622,6 @@ static u_char drv_pattern[NR_SBPCD]={speed_auto,speed_auto,speed_auto,speed_auto ...@@ -623,8 +622,6 @@ static u_char drv_pattern[NR_SBPCD]={speed_auto,speed_auto,speed_auto,speed_auto
/* /*
* drive space begins here (needed separate for each unit) * drive space begins here (needed separate for each unit)
*/ */
static int d; /* DriveStruct index: drive number */
static struct sbpcd_drive { static struct sbpcd_drive {
char drv_id; /* "jumpered" drive ID or -1 */ char drv_id; /* "jumpered" drive ID or -1 */
char drv_sel; /* drive select lines bits */ char drv_sel; /* drive select lines bits */
...@@ -762,7 +759,7 @@ static void msg(int level, const char *fmt, ...) ...@@ -762,7 +759,7 @@ static void msg(int level, const char *fmt, ...)
msgnum++; msgnum++;
if (msgnum>99) msgnum=0; if (msgnum>99) msgnum=0;
sprintf(buf, MSG_LEVEL "%s-%d [%02d]: ", major_name, d, msgnum); sprintf(buf, MSG_LEVEL "%s-%d [%02d]: ", major_name, current_drive - D_S, msgnum);
va_start(args, fmt); va_start(args, fmt);
vsprintf(&buf[18], fmt, args); vsprintf(&buf[18], fmt, args);
va_end(args); va_end(args);
...@@ -1998,14 +1995,13 @@ static int SetSpeed(void) ...@@ -1998,14 +1995,13 @@ static int SetSpeed(void)
return (i); return (i);
} }
static void switch_drive(int i); static void switch_drive(struct sbpcd_drive *);
static int sbpcd_select_speed(struct cdrom_device_info *cdi, int speed) static int sbpcd_select_speed(struct cdrom_device_info *cdi, int speed)
{ {
int i = minor(cdi->dev); struct sbpcd_drive *p = cdi->handle;
if (p != current_drive)
if (i != d) switch_drive(p);
switch_drive(i);
return cc_SetSpeed(speed == 2 ? speed_300 : speed_150, 0, 0); return cc_SetSpeed(speed == 2 ? speed_300 : speed_150, 0, 0);
} }
...@@ -2040,11 +2036,9 @@ static int DriveReset(void) ...@@ -2040,11 +2036,9 @@ static int DriveReset(void)
static int sbpcd_reset(struct cdrom_device_info *cdi) static int sbpcd_reset(struct cdrom_device_info *cdi)
{ {
int i = minor(cdi->dev); struct sbpcd_drive *p = cdi->handle;
if (p != current_drive)
if (i != d) switch_drive(p);
switch_drive(i);
return DriveReset(); return DriveReset();
} }
...@@ -2156,7 +2150,7 @@ static int cc_LockDoor(char lock) ...@@ -2156,7 +2150,7 @@ static int cc_LockDoor(char lock)
int i; int i;
if (fam0_drive) return (0); if (fam0_drive) return (0);
msg(DBG_LCK,"cc_LockDoor: %d (drive %d)\n", lock, d); msg(DBG_LCK,"cc_LockDoor: %d (drive %d)\n", lock, current_drive - D_S);
msg(DBG_LCS,"p_door_locked bit %d before\n", st_door_locked); msg(DBG_LCS,"p_door_locked bit %d before\n", st_door_locked);
clr_cmdbuf(); clr_cmdbuf();
response_count=0; response_count=0;
...@@ -2250,7 +2244,7 @@ static int cc_CloseTray(void) ...@@ -2250,7 +2244,7 @@ static int cc_CloseTray(void)
int i; int i;
if (fam0_drive) return (0); if (fam0_drive) return (0);
msg(DBG_LCK,"cc_CloseTray (drive %d)\n", d); msg(DBG_LCK,"cc_CloseTray (drive %d)\n", current_drive - D_S);
msg(DBG_LCS,"p_door_closed bit %d before\n", st_door_closed); msg(DBG_LCS,"p_door_closed bit %d before\n", st_door_closed);
clr_cmdbuf(); clr_cmdbuf();
...@@ -2319,10 +2313,8 @@ static int cc_CloseTray(void) ...@@ -2319,10 +2313,8 @@ static int cc_CloseTray(void)
static int sbpcd_tray_move(struct cdrom_device_info *cdi, int position) static int sbpcd_tray_move(struct cdrom_device_info *cdi, int position)
{ {
int i;
int retval=0; int retval=0;
i = minor(cdi->dev); switch_drive(cdi->handle);
switch_drive(i);
/* DUH! --AJK */ /* DUH! --AJK */
if(current_drive->CD_changed != 0xFF) { if(current_drive->CD_changed != 0xFF) {
current_drive->CD_changed=0xFF; current_drive->CD_changed=0xFF;
...@@ -3297,7 +3289,7 @@ static int __init check_version(void) ...@@ -3297,7 +3289,7 @@ static int __init check_version(void)
int i, j, l; int i, j, l;
int teac_possible=0; int teac_possible=0;
msg(DBG_INI,"check_version: id=%d, d=%d.\n", current_drive->drv_id, d); msg(DBG_INI,"check_version: id=%d, d=%d.\n", current_drive->drv_id, current_drive - D_S);
current_drive->drv_type=0; current_drive->drv_type=0;
/* check for CR-52x, CR-56x, LCS-7260 and ECS-AT */ /* check for CR-52x, CR-56x, LCS-7260 and ECS-AT */
...@@ -3578,12 +3570,12 @@ static int __init check_version(void) ...@@ -3578,12 +3570,12 @@ static int __init check_version(void)
return (0); return (0);
} }
/*==========================================================================*/ /*==========================================================================*/
static void switch_drive(int i) static void switch_drive(struct sbpcd_drive *p)
{ {
d=i; current_drive = p;
current_drive = D_S + i;
OUT(CDo_enable,current_drive->drv_sel); OUT(CDo_enable,current_drive->drv_sel);
msg(DBG_DID,"drive %d (ID=%d) activated.\n", i, current_drive->drv_id); msg(DBG_DID,"drive %d (ID=%d) activated.\n",
current_drive - D_S, current_drive->drv_id);
return; return;
} }
/*==========================================================================*/ /*==========================================================================*/
...@@ -3703,10 +3695,11 @@ static int __init check_drives(void) ...@@ -3703,10 +3695,11 @@ static int __init check_drives(void)
ndrives=0; ndrives=0;
for (j=0;j<max_drives;j++) for (j=0;j<max_drives;j++)
{ {
D_S[ndrives].drv_id=j; struct sbpcd_drive *p = D_S + ndrives;
if (sbpro_type==1) D_S[ndrives].drv_sel=(j&0x01)<<1|(j&0x02)>>1; p->drv_id=j;
else D_S[ndrives].drv_sel=j; if (sbpro_type==1) p->drv_sel=(j&0x01)<<1|(j&0x02)>>1;
switch_drive(ndrives); else p->drv_sel=j;
switch_drive(p);
msg(DBG_INI,"check_drives: drive %d (ID=%d) activated.\n",ndrives,j); msg(DBG_INI,"check_drives: drive %d (ID=%d) activated.\n",ndrives,j);
msg(DBG_000,"check_drives: drive %d (ID=%d) activated.\n",ndrives,j); msg(DBG_000,"check_drives: drive %d (ID=%d) activated.\n",ndrives,j);
i=check_version(); i=check_version();
...@@ -3716,7 +3709,7 @@ static int __init check_drives(void) ...@@ -3716,7 +3709,7 @@ static int __init check_drives(void)
current_drive->drv_options=drv_pattern[j]; current_drive->drv_options=drv_pattern[j];
if (fam0L_drive) current_drive->drv_options&=~(speed_auto|speed_300|speed_150); if (fam0L_drive) current_drive->drv_options&=~(speed_auto|speed_300|speed_150);
msg(DBG_INF, "Drive %d (ID=%d): %.9s (%.4s) at 0x%03X (type %d)\n", msg(DBG_INF, "Drive %d (ID=%d): %.9s (%.4s) at 0x%03X (type %d)\n",
d, current_drive - D_S,
current_drive->drv_id, current_drive->drv_id,
current_drive->drive_model, current_drive->drive_model,
current_drive->firmware_version, current_drive->firmware_version,
...@@ -3985,6 +3978,7 @@ static int DiskInfo(void) ...@@ -3985,6 +3978,7 @@ static int DiskInfo(void)
static int sbpcd_drive_status(struct cdrom_device_info *cdi, int slot_nr) static int sbpcd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
{ {
struct sbpcd_drive *p = cdi->handle;
int st; int st;
if (CDSL_CURRENT != slot_nr) { if (CDSL_CURRENT != slot_nr) {
...@@ -4007,13 +4001,13 @@ static int sbpcd_drive_status(struct cdrom_device_info *cdi, int slot_nr) ...@@ -4007,13 +4001,13 @@ static int sbpcd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
msg(DBG_000,"Drive Status: busy =%d.\n", st_busy); msg(DBG_000,"Drive Status: busy =%d.\n", st_busy);
#if 0 #if 0
if (!(D_S[minor(cdi->dev)].status_bits & p_door_closed)) return CDS_TRAY_OPEN; if (!(p->status_bits & p_door_closed)) return CDS_TRAY_OPEN;
if (D_S[minor(cdi->dev)].status_bits & p_disk_ok) return CDS_DISC_OK; if (p->status_bits & p_disk_ok) return CDS_DISC_OK;
if (D_S[minor(cdi->dev)].status_bits & p_disk_in) return CDS_DRIVE_NOT_READY; if (p->status_bits & p_disk_in) return CDS_DRIVE_NOT_READY;
return CDS_NO_DISC; return CDS_NO_DISC;
#else #else
if (D_S[minor(cdi->dev)].status_bits & p_spinning) return CDS_DISC_OK; if (p->status_bits & p_spinning) return CDS_DISC_OK;
/* return CDS_TRAY_OPEN; */ /* return CDS_TRAY_OPEN; */
return CDS_NO_DISC; return CDS_NO_DISC;
...@@ -4148,9 +4142,10 @@ static int sbp_status(void) ...@@ -4148,9 +4142,10 @@ static int sbp_status(void)
static int sbpcd_get_last_session(struct cdrom_device_info *cdi, struct cdrom_multisession *ms_infp) static int sbpcd_get_last_session(struct cdrom_device_info *cdi, struct cdrom_multisession *ms_infp)
{ {
struct sbpcd_drive *p = cdi->handle;
ms_infp->addr_format = CDROM_LBA; ms_infp->addr_format = CDROM_LBA;
ms_infp->addr.lba = D_S[minor(cdi->dev)].lba_multi; ms_infp->addr.lba = p->lba_multi;
if (D_S[minor(cdi->dev)].f_multisession) if (p->f_multisession)
ms_infp->xa_flag=1; /* valid redirection address */ ms_infp->xa_flag=1; /* valid redirection address */
else else
ms_infp->xa_flag=0; /* invalid redirection address */ ms_infp->xa_flag=0; /* invalid redirection address */
...@@ -4166,20 +4161,19 @@ static int sbpcd_get_last_session(struct cdrom_device_info *cdi, struct cdrom_mu ...@@ -4166,20 +4161,19 @@ static int sbpcd_get_last_session(struct cdrom_device_info *cdi, struct cdrom_mu
static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd, static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd,
u_long arg) u_long arg)
{ {
struct sbpcd_drive *p = cdi->handle;
int i; int i;
msg(DBG_IO2,"ioctl(%d, 0x%08lX, 0x%08lX)\n", msg(DBG_IO2,"ioctl(%s, 0x%08lX, 0x%08lX)\n", cdi->name, cmd, arg);
minor(cdi->dev), cmd, arg); if (p->drv_id==-1) {
i=minor(cdi->dev); msg(DBG_INF, "ioctl: bad device: %s\n", cdi->name);
if ((i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1))
{
msg(DBG_INF, "ioctl: bad device: %04X\n", cdi->dev);
return (-ENXIO); /* no such drive */ return (-ENXIO); /* no such drive */
} }
down(&ioctl_read_sem); down(&ioctl_read_sem);
if (d!=i) switch_drive(i); if (p != current_drive)
switch_drive(p);
msg(DBG_IO2,"ioctl: device %d, request %04X\n",i,cmd); msg(DBG_IO2,"ioctl: device %s, request %04X\n",cdi->name,cmd);
switch (cmd) /* Sun-compatible */ switch (cmd) /* Sun-compatible */
{ {
case DDIOCSDBG: /* DDI Debug */ case DDIOCSDBG: /* DDI Debug */
...@@ -4487,20 +4481,19 @@ static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd, ...@@ -4487,20 +4481,19 @@ static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd,
static int sbpcd_audio_ioctl(struct cdrom_device_info *cdi, u_int cmd, static int sbpcd_audio_ioctl(struct cdrom_device_info *cdi, u_int cmd,
void * arg) void * arg)
{ {
struct sbpcd_drive *p = cdi->handle;
int i, st, j; int i, st, j;
msg(DBG_IO2,"ioctl(%d, 0x%08lX, 0x%08p)\n", msg(DBG_IO2,"ioctl(%s, 0x%08lX, 0x%08p)\n", cdi->name, cmd, arg);
minor(cdi->dev), cmd, arg); if (p->drv_id==-1) {
i=minor(cdi->dev); msg(DBG_INF, "ioctl: bad device: %s\n", cdi->name);
if ((i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1))
{
msg(DBG_INF, "ioctl: bad device: %04X\n", cdi->dev);
return (-ENXIO); /* no such drive */ return (-ENXIO); /* no such drive */
} }
down(&ioctl_read_sem); down(&ioctl_read_sem);
if (d!=i) switch_drive(i); if (p != current_drive)
switch_drive(p);
msg(DBG_IO2,"ioctl: device %d, request %04X\n",i,cmd); msg(DBG_IO2,"ioctl: device %s, request %04X\n",cdi->name,cmd);
switch (cmd) /* Sun-compatible */ switch (cmd) /* Sun-compatible */
{ {
...@@ -4836,8 +4829,9 @@ static void do_sbpcd_request(request_queue_t * q) ...@@ -4836,8 +4829,9 @@ static void do_sbpcd_request(request_queue_t * q)
{ {
u_int block; u_int block;
u_int nsect; u_int nsect;
int i, status_tries, data_tries; int status_tries, data_tries;
struct request *req; struct request *req;
struct sbpcd_drive *p;
#ifdef DEBUG_GTL #ifdef DEBUG_GTL
static int xx_nr=0; static int xx_nr=0;
int xnr; int xnr;
...@@ -4876,9 +4870,8 @@ static void do_sbpcd_request(request_queue_t * q) ...@@ -4876,9 +4870,8 @@ static void do_sbpcd_request(request_queue_t * q)
msg(DBG_INF, "bad cmd %d\n", req->cmd); msg(DBG_INF, "bad cmd %d\n", req->cmd);
goto err_done; goto err_done;
} }
i = minor(req->rq_dev); p = D_S + minor(req->rq_dev);
if ( (i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1)) if (p->drv_id==-1) {
{
msg(DBG_INF, "do_request: bad device: %s\n", msg(DBG_INF, "do_request: bad device: %s\n",
kdevname(req->rq_dev)); kdevname(req->rq_dev));
goto err_done; goto err_done;
...@@ -4888,8 +4881,9 @@ static void do_sbpcd_request(request_queue_t * q) ...@@ -4888,8 +4881,9 @@ static void do_sbpcd_request(request_queue_t * q)
busy_data=1; busy_data=1;
#endif /* OLD_BUSY */ #endif /* OLD_BUSY */
if (D_S[i].audio_state==audio_playing) goto err_done; if (p->audio_state==audio_playing) goto err_done;
if (d!=i) switch_drive(i); if (p != current_drive)
switch_drive(p);
block = req->sector; /* always numbered as 512-byte-pieces */ block = req->sector; /* always numbered as 512-byte-pieces */
nsect = req->nr_sectors; /* always counted as 512-byte-pieces */ nsect = req->nr_sectors; /* always counted as 512-byte-pieces */
...@@ -5371,12 +5365,10 @@ static struct block_device_operations sbpcd_bdops = ...@@ -5371,12 +5365,10 @@ static struct block_device_operations sbpcd_bdops =
*/ */
static int sbpcd_open(struct cdrom_device_info *cdi, int purpose) static int sbpcd_open(struct cdrom_device_info *cdi, int purpose)
{ {
int i; struct sbpcd_drive *p = cdi->handle;
i = minor(cdi->dev);
down(&ioctl_read_sem); down(&ioctl_read_sem);
switch_drive(i); switch_drive(p);
/* /*
* try to keep an "open" counter here and lock the door if 0->1. * try to keep an "open" counter here and lock the door if 0->1.
...@@ -5385,6 +5377,7 @@ static int sbpcd_open(struct cdrom_device_info *cdi, int purpose) ...@@ -5385,6 +5377,7 @@ static int sbpcd_open(struct cdrom_device_info *cdi, int purpose)
current_drive->open_count,current_drive->open_count+1); current_drive->open_count,current_drive->open_count+1);
if (++current_drive->open_count<=1) if (++current_drive->open_count<=1)
{ {
int i;
i=LockDoor(); i=LockDoor();
current_drive->open_count=1; current_drive->open_count=1;
if (famT_drive) msg(DBG_TEA,"sbpcd_open: before i=DiskInfo();.\n"); if (famT_drive) msg(DBG_TEA,"sbpcd_open: before i=DiskInfo();.\n");
...@@ -5410,32 +5403,30 @@ static int sbpcd_open(struct cdrom_device_info *cdi, int purpose) ...@@ -5410,32 +5403,30 @@ static int sbpcd_open(struct cdrom_device_info *cdi, int purpose)
*/ */
static void sbpcd_release(struct cdrom_device_info * cdi) static void sbpcd_release(struct cdrom_device_info * cdi)
{ {
int i; struct sbpcd_drive *p = cdi->handle;
i = minor(cdi->dev); if (p->drv_id==-1) {
if ((i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1)) msg(DBG_INF, "release: bad device: %s\n", cdi->name);
{ return;
msg(DBG_INF, "release: bad device: %04X\n", cdi->dev);
return ;
} }
down(&ioctl_read_sem); down(&ioctl_read_sem);
switch_drive(i); switch_drive(p);
/* /*
* try to keep an "open" counter here and unlock the door if 1->0. * try to keep an "open" counter here and unlock the door if 1->0.
*/ */
msg(DBG_LCK,"open_count: %d -> %d\n", msg(DBG_LCK,"open_count: %d -> %d\n",
current_drive->open_count,current_drive->open_count-1); p->open_count,p->open_count-1);
if (current_drive->open_count>-2) /* CDROMEJECT may have been done */ if (p->open_count>-2) /* CDROMEJECT may have been done */
{ {
if (--current_drive->open_count<=0) if (--p->open_count<=0)
{ {
current_drive->sbp_first_frame=current_drive->sbp_last_frame=-1; p->sbp_first_frame=p->sbp_last_frame=-1;
if (current_drive->audio_state!=audio_playing) if (p->audio_state!=audio_playing)
if (current_drive->f_eject) cc_SpinDown(); if (p->f_eject) cc_SpinDown();
current_drive->diskstate_flags &= ~cd_size_bit; p->diskstate_flags &= ~cd_size_bit;
current_drive->open_count=0; p->open_count=0;
#if SAFE_MIXED #if SAFE_MIXED
current_drive->has_data=0; p->has_data=0;
#endif /* SAFE_MIXED */ #endif /* SAFE_MIXED */
} }
} }
...@@ -5466,13 +5457,6 @@ static struct cdrom_device_ops sbpcd_dops = { ...@@ -5466,13 +5457,6 @@ static struct cdrom_device_ops sbpcd_dops = {
n_minors: 1, n_minors: 1,
}; };
static struct cdrom_device_info sbpcd_info = {
ops: &sbpcd_dops,
speed: 2,
capacity: 1,
name: "sbpcd",
};
/*==========================================================================*/ /*==========================================================================*/
/* /*
* accept "kernel command line" parameters * accept "kernel command line" parameters
...@@ -5711,21 +5695,23 @@ int __init sbpcd_init(void) ...@@ -5711,21 +5695,23 @@ int __init sbpcd_init(void)
for (j=0;j<NR_SBPCD;j++) for (j=0;j<NR_SBPCD;j++)
{ {
if (D_S[j].drv_id==-1) continue; struct sbpcd_drive *p = D_S + j;
switch_drive(j); if (p->drv_id==-1)
continue;
switch_drive(p);
#if 1 #if 1
if (!famL_drive) cc_DriveReset(); if (!famL_drive) cc_DriveReset();
#endif #endif
if (!st_spinning) cc_SpinUp(); if (!st_spinning) cc_SpinUp();
D_S[j].sbp_first_frame = -1; /* First frame in buffer */ p->sbp_first_frame = -1; /* First frame in buffer */
D_S[j].sbp_last_frame = -1; /* Last frame in buffer */ p->sbp_last_frame = -1; /* Last frame in buffer */
D_S[j].sbp_read_frames = 0; /* Number of frames being read to buffer */ p->sbp_read_frames = 0; /* Number of frames being read to buffer */
D_S[j].sbp_current = 0; /* Frame being currently read */ p->sbp_current = 0; /* Frame being currently read */
D_S[j].CD_changed=1; p->CD_changed=1;
D_S[j].frame_size=CD_FRAMESIZE; p->frame_size=CD_FRAMESIZE;
D_S[j].f_eject=0; p->f_eject=0;
#if EJECT #if EJECT
if (!fam0_drive) D_S[j].f_eject=1; if (!fam0_drive) p->f_eject=1;
#endif /* EJECT */ #endif /* EJECT */
cc_ReadStatus(); cc_ReadStatus();
i=ResponseStatus(); /* returns orig. status or p_busy_new */ i=ResponseStatus(); /* returns orig. status or p_busy_new */
...@@ -5745,8 +5731,8 @@ int __init sbpcd_init(void) ...@@ -5745,8 +5731,8 @@ int __init sbpcd_init(void)
} }
msg(DBG_INI,"init: first GetStatus: %d\n",i); msg(DBG_INI,"init: first GetStatus: %d\n",i);
msg(DBG_LCS,"init: first GetStatus: error_byte=%d\n", msg(DBG_LCS,"init: first GetStatus: error_byte=%d\n",
D_S[j].error_byte); p->error_byte);
if (D_S[j].error_byte==aud_12) if (p->error_byte==aud_12)
{ {
timeout=jiffies+2*HZ; timeout=jiffies+2*HZ;
do do
...@@ -5755,14 +5741,14 @@ int __init sbpcd_init(void) ...@@ -5755,14 +5741,14 @@ int __init sbpcd_init(void)
msg(DBG_INI,"init: second GetStatus: %02X\n",i); msg(DBG_INI,"init: second GetStatus: %02X\n",i);
msg(DBG_LCS, msg(DBG_LCS,
"init: second GetStatus: error_byte=%d\n", "init: second GetStatus: error_byte=%d\n",
D_S[j].error_byte); p->error_byte);
if (i<0) break; if (i<0) break;
if (!st_caddy_in) break; if (!st_caddy_in) break;
} }
while ((!st_diskok)||time_after(jiffies, timeout)); while ((!st_diskok)||time_after(jiffies, timeout));
} }
i=SetSpeed(); i=SetSpeed();
if (i>=0) D_S[j].CD_changed=1; if (i>=0) p->CD_changed=1;
} }
/* /*
...@@ -5791,24 +5777,26 @@ int __init sbpcd_init(void) ...@@ -5791,24 +5777,26 @@ int __init sbpcd_init(void)
for (j=0;j<NR_SBPCD;j++) for (j=0;j<NR_SBPCD;j++)
{ {
struct cdrom_device_info * sbpcd_infop; struct cdrom_device_info * sbpcd_infop;
struct sbpcd_drive *p = D_S + j;
if (D_S[j].drv_id==-1) continue; if (p->drv_id==-1) continue;
switch_drive(j); switch_drive(p);
#if SAFE_MIXED #if SAFE_MIXED
D_S[j].has_data=0; p->has_data=0;
#endif /* SAFE_MIXED */ #endif /* SAFE_MIXED */
/* /*
* allocate memory for the frame buffers * allocate memory for the frame buffers
*/ */
D_S[j].aud_buf=NULL; p->aud_buf=NULL;
D_S[j].sbp_audsiz=0; p->sbp_audsiz=0;
D_S[j].sbp_bufsiz=buffers; p->sbp_bufsiz=buffers;
if (D_S[j].drv_type&drv_fam1) if (p->drv_type&drv_fam1)
if (READ_AUDIO>0) D_S[j].sbp_audsiz=READ_AUDIO; if (READ_AUDIO>0)
D_S[j].sbp_buf=(u_char *) vmalloc(D_S[j].sbp_bufsiz*CD_FRAMESIZE); p->sbp_audsiz = READ_AUDIO;
if (D_S[j].sbp_buf==NULL) p->sbp_buf=(u_char *) vmalloc(buffers*CD_FRAMESIZE);
{ if (!p->sbp_buf) {
msg(DBG_INF,"data buffer (%d frames) not available.\n",D_S[j].sbp_bufsiz); msg(DBG_INF,"data buffer (%d frames) not available.\n",
buffers);
if ((unregister_blkdev(MAJOR_NR, major_name) == -EINVAL)) if ((unregister_blkdev(MAJOR_NR, major_name) == -EINVAL))
{ {
printk("Can't unregister %s\n", major_name); printk("Can't unregister %s\n", major_name);
...@@ -5820,11 +5808,11 @@ int __init sbpcd_init(void) ...@@ -5820,11 +5808,11 @@ int __init sbpcd_init(void)
#ifdef MODULE #ifdef MODULE
msg(DBG_INF,"data buffer size: %d frames.\n",buffers); msg(DBG_INF,"data buffer size: %d frames.\n",buffers);
#endif /* MODULE */ #endif /* MODULE */
if (D_S[j].sbp_audsiz>0) if (p->sbp_audsiz>0)
{ {
D_S[j].aud_buf=(u_char *) vmalloc(D_S[j].sbp_audsiz*CD_FRAMESIZE_RAW); p->aud_buf=(u_char *) vmalloc(p->sbp_audsiz*CD_FRAMESIZE_RAW);
if (D_S[j].aud_buf==NULL) msg(DBG_INF,"audio buffer (%d frames) not available.\n",D_S[j].sbp_audsiz); if (p->aud_buf==NULL) msg(DBG_INF,"audio buffer (%d frames) not available.\n",p->sbp_audsiz);
else msg(DBG_INF,"audio buffer size: %d frames.\n",D_S[j].sbp_audsiz); else msg(DBG_INF,"audio buffer size: %d frames.\n",p->sbp_audsiz);
} }
sbpcd_infop = vmalloc(sizeof (struct cdrom_device_info)); sbpcd_infop = vmalloc(sizeof (struct cdrom_device_info));
if (sbpcd_infop == NULL) if (sbpcd_infop == NULL)
...@@ -5833,12 +5821,15 @@ int __init sbpcd_init(void) ...@@ -5833,12 +5821,15 @@ int __init sbpcd_init(void)
blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
return -ENOMEM; return -ENOMEM;
} }
D_S[j].sbpcd_infop = sbpcd_infop; memset(sbpcd_infop, 0, sizeof(struct cdrom_device_info));
memcpy (sbpcd_infop, &sbpcd_info, sizeof(struct cdrom_device_info)); sbpcd_infop->ops = &sbpcd_dops;
sbpcd_infop->speed = 2;
sbpcd_infop->capacity = 1;
sprintf(sbpcd_infop->name, "sbpcd%d", j);
sbpcd_infop->dev = mk_kdev(MAJOR_NR, j); sbpcd_infop->dev = mk_kdev(MAJOR_NR, j);
strncpy(sbpcd_infop->name,major_name, sizeof(sbpcd_infop->name)); sbpcd_infop->handle = p;
p->sbpcd_infop = sbpcd_infop;
sprintf (nbuff, "c0t%d/cd", D_S[j].drv_id); sprintf(nbuff, "c0t%d/cd", p->drv_id);
sbpcd_infop->de = sbpcd_infop->de =
devfs_register (devfs_handle, nbuff, DEVFS_FL_DEFAULT, devfs_register (devfs_handle, nbuff, DEVFS_FL_DEFAULT,
MAJOR_NR, j, S_IFBLK | S_IRUGO | S_IWUGO, MAJOR_NR, j, S_IFBLK | S_IRUGO | S_IWUGO,
...@@ -5889,22 +5880,15 @@ module_exit(sbpcd_exit); ...@@ -5889,22 +5880,15 @@ module_exit(sbpcd_exit);
#endif /* MODULE */ #endif /* MODULE */
/*==========================================================================*/ static int sbpcd_media_changed(struct cdrom_device_info *cdi, int disc_nr)
/*
* Check if the media has changed in the CD-ROM drive.
* used externally (isofs/inode.c, fs/buffer.c)
*/
static int sbpcd_chk_disk_change(kdev_t full_dev)
{ {
int i; struct sbpcd_drive *p = cdi->handle;
msg(DBG_CHK,"media_check (%s) called\n", cdi->name);
i=minor(full_dev); if (p->CD_changed==0xFF)
msg(DBG_CHK,"media_check (%d) called\n", i);
if (D_S[i].CD_changed==0xFF)
{ {
D_S[i].CD_changed=0; p->CD_changed=0;
msg(DBG_CHK,"medium changed (drive %d)\n", i); msg(DBG_CHK,"medium changed (drive %s)\n", cdi->name);
/* BUG! Should invalidate buffers! --AJK */ /* BUG! Should invalidate buffers! --AJK */
/* Why should it do the above at all?! --mdcki */ /* Why should it do the above at all?! --mdcki */
current_drive->diskstate_flags &= ~toc_bit; current_drive->diskstate_flags &= ~toc_bit;
...@@ -5919,11 +5903,6 @@ static int sbpcd_chk_disk_change(kdev_t full_dev) ...@@ -5919,11 +5903,6 @@ static int sbpcd_chk_disk_change(kdev_t full_dev)
return (0); return (0);
} }
static int sbpcd_media_changed( struct cdrom_device_info *cdi, int disc_nr)
{
return sbpcd_chk_disk_change(cdi->dev);
}
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
/*==========================================================================*/ /*==========================================================================*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment