Linux ATAPI-PD 

史

skato@venus.dti.ne.jp

1999/01/?

̕ł́ALinux  ATAPI-PD gpۂ̒ӓ_ςɂ܂
߂Ă܂B

kernel  make ɂĂ͒mĂ̂Ƃ݂ȂďĂ܂̂ŁA킩
Ȃ͑ JF ̃hLg⏑ЂȂǂĂB



Table of Contents
1. {IȂ
2. ۂ̎gp@
3. kernel-2.0.35(or 36)  ATAPI-PD gɂ
4. ㋉
5. ̑

1. {IȂ

܂Akernel  2.0.33 gp̂΂ȒPłBȉ̐ݒ
make Ă邾łB(2.0.35  36 g͑3͂
)

|CǵAmake *config


  - Floppy,IDE,and other block devices                              
@  @@@@ESCSI emulation support  @Y                         
@@  @@@EInclude@IDE/ATAPI@CDROM@support@@N             
  - SCSI@suppurt                                                   
@  @@@@ESCSI@disk support@@Y                             
@@  @@@ESCSI@CDROM support@@Y@                          
@@@  @@EProbe all LUNs on each SCSI device@@Y             


ƂƂƂłBATAPI CDROM support  N Ȃ̂ɂӂBu
 PD ȊO ATAPI-CDROM hCuĂ񂾂ǂł̂
HvƎvAvłBATAPI-CDROM hCu PD hCuA
Ƃ SCSI emulation ŔF܂B

Ō Probe all LUNs ͂ȂȂ̂IvVłāA悭킩
񂯂ǂƂɂF񂾁IƂ Y ɂƂ̂łB
Panasonic ̂̂ȂȂĂꍇ܂̂ŁA܂ Y ł
݂āA܂NɂĎĂ݂Ƃ̂ł傤B

܂AProbe all LUNs  Y ɂƋNɑSĂ SCSI ID ܂
ŁAÑbZ[Wւ񂤂邳Ȃ܂BQ͂Ȃ̂łA
Ȃ񂾂CƂ́AJ[l̃p[^ max_scsi_luns=?
^Ă܂傤Bł 2 ɂĂ܂BJ[lւ̃IVw
̂肩킩Ƃ́Alilo  loadlin ̃hLgǂ
܂傤B

ȂANEC Ȃǂ Probe all LUNs  Y łȂƔFȂ PD drive 
AN ɂł悤ɂ@܂BAJ[l\[XɎ
ȂĂ͂Ȃ̂ŁA㋉҂ƂčŌɏЉ܂B

ɂĂAƂ肠 Y ł߂Ă݂邱Ƃ߂܂B



2. ۂ̎gp@

̊ł́APD  CD  /dev/scd2 ɂ肠Ă܂B͋N
ɁA


  Detected scsi CD-ROM sr2 at scsi0, channel 0, id 1, lun 0           
    Vendor: NEC       Model: PD-1 ODX654P      Rev: A113              
    Type:   Optical Device                     ANSI SCSI revision: 02 


ƂbZ[Wł邱ƂmF܂Bsr2 Ƃ̂|Cgł
BȂ sr2  scd2 ɂȂ͓̂łÂ悤łB

/dev/ ƁAscd2 Ȃ̂ŐVɍĂȂ΂Ȃ܂
B́A/dev/MAKEDEV R}h(ꂪȂ mknod)g
Bڂ́Aman MAKEDEV(mknod) ǂB PD ƂĎgƂ /dev/
sda 肠ĂĂ܂B̂ւ͊ɂĈقȂƎv̂ŁAN
̃bZ[WēK؂ɓǂ݂ĂB

PD hCu PD  CD Ȃ mountAumount ł邱ƂmF
A /etc/fstab ܂傤BႦ΁A /etc/fstab ͈ȉ̂悤
ɂȂĂ܂B


  /dev/hda2       /       ext2        defaults   1   1              
  /dev/hda1       /win    vfat        defaults   1   2              
  /dev/hda3       swap    swap        defaults                      
  /dev/scd0       /cdrom  iso9660     user,ro,noauto                
  /dev/scd2       /pcd    iso9660     user,ro,noauto                
  /dev/sda        /pd     vfat        user,noauto                   


΂킩ʂA}Eg|CgƂ /pcd  /pd ƂfBNg
炩ߍĂ܂B/cdrom ͕ʂɂȂĂ ATAPI-CDROM h
CupłBPD ̃IvV vfat ɂ̂́AWin98 Ƃ̃f[^l
Ă̂Ƃł̂ŁAgpȂɂ킹ēK؂ɐݒ肵ĂB

ȂA֑ł̂悤 user IvVƈʃ[UłA


  % mount /pcd        PD  CD  mount                             
  % mount /pd         PD  mount                                   


ȂǂƂł悤ɂȂĕ֗łBڂ man mount ǂB



3. kernel-2.0.35(or 36)  ATAPI-PD gɂ

2.0.35(or 36) ł͂Ȃ PD  read only ŔFƂ肪
܂B邽߂ɂ́Akernel source  drivers/scsi/
ide-scsi.c  150-200 sڂ̂ 2.0.33 Ɠɂ邱ƂKvȂ
łB̕@ł͂Ȃɂ肪̂܂񂪁A
Ƃł͈蓮삵Ă܂Bȉ́A2.0.35 (or 36)  ATAPI-PD 
g patch łBfj.os.linux ō_ƂA2.0.34 p patch
JĂ [1] ̂łAȂ܂ĂȂ̂ŁAQ
lɂč܂B

ȉ؂āAide-scsi.c.diff ƂłtĕۑāA drivers/scsi
/ ŁA

  $ patch < ide-scsi.c.diff                                            

ȂǂƂĂĂĂBƂ 1 ͂ɏ] make 邾łB

---------  -----------                                                           
*** linux/drivers/scsi/ide-scsi.c.35.org        Mon Nov 16 21:45:00 1998                 
--- linux/drivers/scsi/ide-scsi.c       Tue Nov 17 05:07:21 1998                         
***************                                                                          
*** 156,162 ****                                                                         
  static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t *pc)        
  {                                                                                      
        idescsi_scsi_t *scsi = drive->scsi;                                              
!       u8 *c = pc->c;                                                                   
                                                                                         
        if (scsi->media == TYPE_ROM) {                                                   
                if (c[0] == READ_6 || c[0] == WRITE_6) {                                 
--- 156,163 ----                                                                         
  static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t *pc)        
  {                                                                                      
        idescsi_scsi_t *scsi = drive->scsi;                                              
!       u8 *c = pc->c, *buf = pc->buffer, *sc = pc->scsi_cmd->cmnd;                      
!       int i;                                                                           
                                                                                         
        if (scsi->media == TYPE_ROM) {                                                   
                if (c[0] == READ_6 || c[0] == WRITE_6) {                                 
***************                                                                          
*** 164,169 ****                                                                         
--- 165,178 ----                                                                         
                        c[3] = c[1] & 0x1f;     c[2] = 0;               c[1] &= 0xe0;    
                        c[0] += (READ_10 - READ_6);                                      
                }                                                                        
+               if (c[0] == MODE_SENSE || (c[0] == MODE_SELECT && buf[3] == 8)) {        
+                       pc->request_transfer -= 4;                                       
+                       memset (c, 0, 12);                                               
+                       c[0] = sc[0] | 0x40;c[2] = sc[2];c[8] = sc[4] - 4;               
+                       if (c[0] == MODE_SENSE_10) return;                               
+                       for (i = 0; i <= 7; i++) buf[i] = 0;                             
+                       for (i = 8; i < pc->buffer_size - 4; i++) buf[i] = buf[i + 4];   
+               }                                                                        
        }                                                                                
  }                                                                                      
                                                                                         
***************                                                                          
*** 171,181 ****                                                                         
  {                                                                                      
        idescsi_scsi_t *scsi = drive->scsi;                                              
        u8 *buf = pc->buffer;                                                            
                                                                                         
        if (scsi->media == TYPE_ROM) {                                                   
!               if (pc->c[0] == INQUIRY)                                                 
!                       buf[2] |= 2;                                                     
!       }                                                                                
  }                                                                                      
                                                                                         
  static inline void idescsi_free_bh (struct buffer_head *bh)                            
--- 180,198 ----                                                                         
  {                                                                                      
        idescsi_scsi_t *scsi = drive->scsi;                                              
        u8 *buf = pc->buffer;                                                            
+       int i;                                                                           
                                                                                         
        if (scsi->media == TYPE_ROM) {                                                   
!               if (pc->c[0] == MODE_SENSE_10 && pc->scsi_cmd->cmnd[0] == MODE_SENSE) {  
!                       buf[0] = buf[1];buf[1] = buf[2];                                 
!                       buf[2] = 0;buf[3] = 8;                                           
!                       for (i = pc->buffer_size - 1; i >= 12; i--)                      
!                       buf[i] = buf[i - 4];                                             
!                       for (i = 11; i >= 4; i--) buf[i] = 0;                            
!               }                                                                        
!               if (pc->c[0] == INQUIRY)                                                 
!                       buf[2] |= 2;                                                     
!         }                                                                              
  }                                                                                      
                                                                                         
  static inline void idescsi_free_bh (struct buffer_head *bh)                            
--------- ܂ -----------                                                           



4. ㋉

Nɏo͂PDhCu Vender  Model  drivers/scsi/scsi.c
̃ubNXgɓo^΁Aʏ Probe all LUNs Kvȋ@ł
OFF ɂĂ悭Ȃ邱Ƃ킩܂B

̋@B̏ꍇ́A

*** scsi.c.bak  Fri Jan 29 08:28:58 1999                               
--- scsi.c      Fri Jan 29 08:28:58 1999                               
***************                                                        
*** 280,285 ****                                                       
--- 280,286 ----                                                       
  {"IOMEGA","Io20S         *F","*", BLIST_KEY},                        
  {"INSITE","Floptical   F*8I","*", BLIST_KEY},                        
  {"INSITE","I325VM","*", BLIST_KEY},                                  
+ {"NEC","PD-1 ODX654P","*", BLIST_FORCELUN | BLIST_SINGLELUN},        
  {"NRC","MBR-7","*", BLIST_FORCELUN | BLIST_SINGLELUN},               
  {"NRC","MBR-7.4","*", BLIST_FORCELUN | BLIST_SINGLELUN},             
  {"REGAL","CDC-4X","*", BLIST_MAX5LUN | BLIST_SINGLELUN},             

ƁAĂ܂B 1 s̒ǉłƂ͊yłˁB̌ʁA PD
 CD  /dev/scd1 ɂӂ悤ɂȂĂ܂(̂ق
Ƃȓł)̂ŁAfstab ̕ύXKvłBȂȀ
kernel-ML ̃A[JCuœ܂B

Ȃ̃[J[̂̂głAdmesg 


  hdc: NEC PD-1 ODX654P, ATAPI CDROM drive - enabling SCSI emulation


ȂǂƂȂĂƂāAVender  Model uĂ邾ł
Ȃ悤ɂ܂ł͂ȂƎv܂(̎ł܂͋
Ă)B

 Probe All LUNs ȂĂ悭ȂƂĂAۂ͕ʂɂƂ
ȂɂȂ̂łAȂɂ낱̂قCłˁB

Ȃ݂ 2.2.[01] ł ide-scsi.c ƂĂ buggy Ȃ̂ŁAATAPI-PD g
͏芷΂炭TقłBSCSI-emulattion  on
ɂ Probe All LUNs  on ɂƁAPD F悤Ƃ邠ŃRP
܂BƂāAProbe All LUNs  OFF ɂāAscsi.c ɏL̈s
Ƃ܂RP܂̂ŏuȂłB܂Ă邩
Ⴂ܂񂭂B



5. ̑

̕yѓYtꂽ patch ͖ۏ؂łBguNĂ͐ӔC
Ƃ܂̂ŁA̐ӔCŎgpĂBԈႢ̎wEAz
ǂ͑劽}łB

Minori TAKAGAKI <takagaki@aurora.dti.ne.jp> l͗LvȃRg
܂B肪Ƃ܂B

ĔzzɂĂ GPL ɏ]܂B

 

(LinuxDoc ϊF2000/05/12 앐Y)
(DocBook ϊF2001/03/03 UTi) 

Notes

[1]  fj.os.linux                                                       
     Message-ID: <35D6E360.AF9D2BED@st.rim.or.jp>                      

