--- zzzz-none-000/linux-2.4.17/include/linux/ide.h 2001-11-22 19:48:07.000000000 +0000 +++ sangam-fb-401/linux-2.4.17/include/linux/ide.h 2005-05-13 14:48:56.000000000 +0000 @@ -5,6 +5,164 @@ * * Copyright (C) 1994-1998 Linus Torvalds & authors */ +#if 0 +typedef struct hwif_s { + struct hwif_s *next; /* for linked-list in ide_hwgroup_t */ + void *hwgroup; /* actually (ide_hwgroup_t *) */ + ide_ioreg_t io_ports[IDE_NR_PORTS]; /* task file registers */ + hw_regs_t hw; /* Hardware info */ + ide_drive_t drives[MAX_DRIVES]; /* drive info */ + struct gendisk *gd; /* gendisk structure */ + ide_tuneproc_t *tuneproc; /* routine to tune PIO mode for drives */ + ide_speedproc_t *speedproc; /* routine to retune DMA modes for drives */ + ide_selectproc_t *selectproc; /* tweaks hardware to select drive */ + ide_resetproc_t *resetproc; /* routine to reset controller after a disk reset */ + ide_intrproc_t *intrproc; /* special interrupt handling for shared pci interrupts */ + ide_maskproc_t *maskproc; /* special host masking for drive selection */ + ide_quirkproc_t *quirkproc; /* check host's drive quirk list */ + ide_rw_proc_t *rwproc; /* adjust timing based upon rq->cmd direction */ + ide_ideproc_t *ideproc; /* CPU-polled transfer routine */ + ide_dmaproc_t *dmaproc; /* dma read/write/abort routine */ + unsigned int *dmatable_cpu; /* dma physical region descriptor table (cpu view) */ + dma_addr_t dmatable_dma; /* dma physical region descriptor table (dma view) */ + struct scatterlist *sg_table; /* Scatter-gather list used to build the above */ + int sg_nents; /* Current number of entries in it */ + int sg_dma_direction; /* dma transfer direction */ + int sg_dma_active; /* is it in use */ + struct hwif_s *mate; /* other hwif from same PCI chip */ + unsigned long dma_base; /* base addr for dma ports */ + unsigned dma_extra; /* extra addr for dma ports */ + unsigned long config_data; /* for use by chipset-specific code */ + unsigned long select_data; /* for use by chipset-specific code */ + struct proc_dir_entry *proc; /* /proc/ide/ directory entry */ + int irq; /* our irq number */ + byte major; /* our major number */ + char name[6]; /* name of interface, eg. "ide0" */ + byte index; /* 0 for ide0; 1 for ide1; ... */ + hwif_chipset_t chipset; /* sub-module for tuning.. */ + unsigned noprobe : 1; /* don't probe for this interface */ + unsigned present : 1; /* this interface exists */ + unsigned serialized : 1; /* serialized operation with mate hwif */ + unsigned sharing_irq: 1; /* 1 = sharing irq with another hwif */ + unsigned reset : 1; /* reset after probe */ + unsigned autodma : 1; /* automatically try to enable DMA at boot */ + unsigned udma_four : 1; /* 1=ATA-66 capable, 0=default */ + byte channel; /* for dual-port chips: 0=primary, 1=secondary */ +#ifdef CONFIG_BLK_DEV_IDEPCI + struct pci_dev *pci_dev; /* for pci chipsets */ + ide_pci_devid_t pci_devid; /* for pci chipsets: {VID,DID} */ +#endif /* CONFIG_BLK_DEV_IDEPCI */ +#if (DISK_RECOVERY_TIME > 0) + unsigned long last_time; /* time when previous rq was done */ +#endif + byte straight8; /* Alan's straight 8 check */ + void *hwif_data; /* extra hwif data */ + ide_busproc_t *busproc; /* driver soft-power interface */ + byte bus_state; /* power state of the IDE bus */ +} ide_hwif_t; + +typedef struct ide_drive_s { + request_queue_t queue; /* request queue */ + struct ide_drive_s *next; /* circular list of hwgroup drives */ + unsigned long sleep; /* sleep until this time */ + unsigned long service_start; /* time we started last request */ + unsigned long service_time; /* service time of last request */ + unsigned long timeout; /* max time to wait for irq */ + special_t special; /* special action flags */ + byte keep_settings; /* restore settings after drive reset */ + byte using_dma; /* disk is using dma for read/write */ + byte retry_pio; /* retrying dma capable host in pio */ + byte state; /* retry state */ + byte waiting_for_dma; /* dma currently in progress */ + byte unmask; /* flag: okay to unmask other irqs */ + byte slow; /* flag: slow data port */ + byte bswap; /* flag: byte swap data */ + byte dsc_overlap; /* flag: DSC overlap */ + byte nice1; /* flag: give potential excess bandwidth */ + unsigned present : 1; /* drive is physically present */ + unsigned noprobe : 1; /* from: hdx=noprobe */ + unsigned busy : 1; /* currently doing revalidate_disk() */ + unsigned removable : 1; /* 1 if need to do check_media_change */ + unsigned forced_geom : 1; /* 1 if hdx=c,h,s was given at boot */ + unsigned no_unmask : 1; /* disallow setting unmask bit */ + unsigned no_io_32bit : 1; /* disallow enabling 32bit I/O */ + unsigned nobios : 1; /* flag: do not probe bios for drive */ + unsigned revalidate : 1; /* request revalidation */ + unsigned atapi_overlap : 1; /* flag: ATAPI overlap (not supported) */ + unsigned nice0 : 1; /* flag: give obvious excess bandwidth */ + unsigned nice2 : 1; /* flag: give a share in our own bandwidth */ + unsigned doorlocking : 1; /* flag: for removable only: door lock/unlock works */ + unsigned autotune : 2; /* 1=autotune, 2=noautotune, 0=default */ + unsigned remap_0_to_1 : 2; /* 0=remap if ezdrive, 1=remap, 2=noremap */ + unsigned ata_flash : 1; /* 1=present, 0=default */ + byte scsi; /* 0=default, 1=skip current ide-subdriver for ide-scsi emulation */ + byte media; /* disk, cdrom, tape, floppy, ... */ + select_t select; /* basic drive/head select reg value */ + byte ctl; /* "normal" value for IDE_CONTROL_REG */ + byte ready_stat; /* min status value for drive ready */ + byte mult_count; /* current multiple sector setting */ + byte mult_req; /* requested multiple sector setting */ + byte tune_req; /* requested drive tuning setting */ + byte io_32bit; /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */ + byte bad_wstat; /* used for ignoring WRERR_STAT */ + byte nowerr; /* used for ignoring WRERR_STAT */ + byte sect0; /* offset of first sector for DM6:DDO */ + byte usage; /* current "open()" count for drive */ + byte head; /* "real" number of heads */ + byte sect; /* "real" sectors per track */ + byte bios_head; /* BIOS/fdisk/LILO number of heads */ + byte bios_sect; /* BIOS/fdisk/LILO sectors per track */ + unsigned int bios_cyl; /* BIOS/fdisk/LILO number of cyls */ + unsigned int cyl; /* "real" number of cyls */ + unsigned long capacity; /* total number of sectors */ + unsigned int drive_data; /* for use by tuneproc/selectproc as needed */ + void *hwif; /* actually (ide_hwif_t *) */ + wait_queue_head_t wqueue; /* used to wait for drive in open() */ + struct hd_driveid *id; /* drive model identification info */ + struct hd_struct *part; /* drive partition table */ + char name[4]; /* drive name, such as "hda" */ + void *driver; /* (ide_driver_t *) */ + void *driver_data; /* extra driver data */ + devfs_handle_t de; /* directory for device */ + struct proc_dir_entry *proc; /* /proc/ide/ directory entry */ + void *settings; /* /proc/ide/ drive settings */ + char driver_req[10]; /* requests specific driver */ + int last_lun; /* last logical unit */ + int forced_lun; /* if hdxlun was given at boot */ + int lun; /* logical unit */ + int crc_count; /* crc counter to reduce drive speed */ + byte quirk_list; /* drive is considered quirky if set for a specific host */ + byte suspend_reset; /* drive suspend mode flag, soft-reset recovers */ + byte init_speed; /* transfer rate set at boot */ + byte current_speed; /* current transfer rate set */ + byte dn; /* now wide spread use */ + unsigned int failures; /* current failure count */ + unsigned int max_failures; /* maximum allowed failure count */ +} ide_drive_t; + +#endif + +#if !defined(NDEBUG) && defined(IDE_TEST) && 0 +#define DEBUG +#define DBG_LEVEL_IDE KERN_ERR +#define DBG_IDE( args... ) printk( DBG_LEVEL_IDE "[IDE] " ); printk( DBG_LEVEL_IDE args ); printk( DBG_LEVEL_IDE "\n" ) +#define DBG_IDE_HWIF( p_hwif ) \ + printk( DBG_LEVEL_IDE "[IDE] (HWIF:%d), %p %d %s %s\n", \ + (p_hwif)->index, \ + (void *) ((p_hwif)->io_ports[0]), \ + (p_hwif)->irq, \ + (p_hwif)->present ? "present" : "not present", \ + (p_hwif)->noprobe ? "noprobe" : "probe" ) + +#define DBG_IDE_DRIVE( p_drv ) \ + printk( DBG_LEVEL_IDE "[IDE] (DRIVE) %s %s\n", \ + p_drv->present ? "present" : "not present", \ + p_drv->noprobe ? "noprobe" : "probe" ) +#else +#define DBG_IDE( args... ) +#define DBG_IDE_HWIF( p_hwif ) +#define DBG_IDE_DRIVE( p_drv ) +#endif #include #include @@ -15,6 +173,9 @@ #include #include #include +#ifdef CONFIG_TOSHIBA_JMR3927 +#include +#endif /* * This is the multiple IDE interface driver, as evolved from hd.c. @@ -139,8 +300,20 @@ #define IDE_BCOUNTH_REG IDE_HCYL_REG #define GET_ERR() IN_BYTE(IDE_ERROR_REG) + +#if !defined(IDE_TEST) + #define GET_STAT() IN_BYTE(IDE_STATUS_REG) #define GET_ALTSTAT() IN_BYTE(IDE_CONTROL_REG) + +#else +extern unsigned char deb_getstat( unsigned long port ); +#define GET_STAT() deb_getstat( IDE_STATUS_REG ) +#define GET_ALTSTAT() deb_getstat( IDE_CONTROL_REG ) + +#endif + + #define OK_STAT(stat,good,bad) (((stat)&((good)|(bad)))==(good)) #define BAD_R_STAT (BUSY_STAT | ERR_STAT) #define BAD_W_STAT (BAD_R_STAT | WRERR_STAT) @@ -216,7 +389,9 @@ * Check for an interrupt and acknowledge the interrupt status */ struct hwif_s; +struct ide_drive_s; typedef int (ide_ack_intr_t)(struct hwif_s *); +typedef void (ide_xfer_data_t)(struct ide_drive_s *, void *, unsigned int); #ifndef NO_DMA #define NO_DMA 255 @@ -228,8 +403,12 @@ typedef struct hw_regs_s { ide_ioreg_t io_ports[IDE_NR_PORTS]; /* task file registers */ int irq; /* our irq number */ - int dma; /* our dma entry */ + int dma; /* our dma number */ ide_ack_intr_t *ack_intr; /* acknowledge interrupt */ + ide_xfer_data_t *ide_output_data; /* write data to i/face */ + ide_xfer_data_t *ide_input_data; /* read data from i/face */ + ide_xfer_data_t *atapi_output_bytes; /* write bytes to i/face */ + ide_xfer_data_t *atapi_input_bytes; /* read bytes from i/face */ void *priv; /* interface specific data */ } hw_regs_t; @@ -256,6 +435,8 @@ * or IN_BYTE functions, we make some defaults here. */ +#ifndef JMR3927_INIT_INDIRECT_PCI + #ifndef HAVE_ARCH_OUT_BYTE #ifdef REALLY_FAST_IO #define OUT_BYTE(b,p) outb((b),(p)) @@ -267,11 +448,19 @@ #ifndef HAVE_ARCH_IN_BYTE #ifdef REALLY_FAST_IO #define IN_BYTE(p) (byte)inb_p(p) -#else +#else +//this one #define IN_BYTE(p) (byte)inb(p) #endif #endif +#else /* JMR3927_INIT_INDIRECT_PCI */ + +#define OUT_BYTE(b,p) tx_iooutb((b),(unsigned char *)(p)) +#define IN_BYTE(p) (unsigned char)tx_ioinb((unsigned char *)(p)) + +#endif /* JMR3927_INIT_INDIRECT_PCI */ + /* * Now for the data we need to maintain per-drive: ide_drive_t */ @@ -449,7 +638,7 @@ ide_qd65xx, ide_umc8672, ide_ht6560b, ide_pdc4030, ide_rz1000, ide_trm290, ide_cmd646, ide_cy82c693, ide_4drives, - ide_pmac, ide_etrax100 + ide_pmac, ide_etrax100, ide_acorn } hwif_chipset_t; #define IDE_CHIPSET_PCI_MASK \