Author: cts
Date: Mon May 21 19:39:35 2007
New Revision: 8681

Log:
enable ATARI_SCSI and ATARI_ROM_ISA


Added:
   
dists/sid/linux-2.6/debian/patches/bugfix/m68k/debian-2.6.21-2-atari-scsi.diff
   dists/sid/linux-2.6/debian/patches/bugfix/m68k/debian-2.6.21-2-rom-isa.diff
Modified:
   dists/sid/linux-2.6/debian/arch/m68k/config.atari
   dists/sid/linux-2.6/debian/changelog

Modified: dists/sid/linux-2.6/debian/arch/m68k/config.atari
==============================================================================
--- dists/sid/linux-2.6/debian/arch/m68k/config.atari   (original)
+++ dists/sid/linux-2.6/debian/arch/m68k/config.atari   Mon May 21 19:39:35 2007
@@ -107,16 +107,14 @@
 # enable new ethernet drivers
 CONFIG_ARANYM=y
 CONFIG_NATFEAT=y
-# Atari SCSI driver is buggy
-# CONFIG_ATARI_SCSI is not set
 # enable ethernet
 CONFIG_NET_ETHERNET=y
 CONFIG_ATARILANCE=y
 CONFIG_ATARI_NFETH=y
-CONFIG_ATARI_ETHERNEC=m
+CONFIG_ATARI_ETHERNEC=y
 # 2.6.21
-# disable atari_rom_isa for now
-# CONFIG_ATARI_ROM_ISA is not set
 # uses undefined isa_*
 # CONFIG_PARPORT is not set
 # CONFIG_PARPORT_PC
+CONFIG_ATARI_ROM_ISA=y
+CONFIG_ATARI_SCSI=y

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog        (original)
+++ dists/sid/linux-2.6/debian/changelog        Mon May 21 19:39:35 2007
@@ -7,7 +7,10 @@
   * sparc64: enable USB_SERIAL. (closes: #412740)
   * Apply stable 2.6.21.1.
 
- -- maximilian attems <[EMAIL PROTECTED]>  Mon, 21 May 2007 10:49:30 +0200
+  [ Christian T. Steigies ]
+  * m68k: enable ATARI_SCSI and ATARI_ROM_ISA
+
+ -- Christian T. Steigies <[EMAIL PROTECTED]>  Mon, 21 May 2007 21:37:26 +0200
 
 linux-2.6 (2.6.21-2) unstable; urgency=low
 

Added: 
dists/sid/linux-2.6/debian/patches/bugfix/m68k/debian-2.6.21-2-atari-scsi.diff
==============================================================================
--- (empty file)
+++ 
dists/sid/linux-2.6/debian/patches/bugfix/m68k/debian-2.6.21-2-atari-scsi.diff  
    Mon May 21 19:39:35 2007
@@ -0,0 +1,295 @@
+--- l/drivers/scsi/atari_scsi.c.org    2007-05-18 18:24:37.000000000 +0200
++++ l/drivers/scsi/atari_scsi.c        2007-05-20 21:31:46.000000000 +0200
+@@ -186,17 +186,18 @@
+ /***************************** Prototypes *****************************/
+ 
+ #ifdef REAL_DMA
+-static int scsi_dma_is_ignored_buserr(unsigned char dma_stat);
+-static void atari_scsi_fetch_restbytes(void);
+-static long atari_scsi_dma_residual(struct Scsi_Host *instance);
+-static int falcon_classify_cmd(Scsi_Cmnd *cmd);
+-static unsigned long atari_dma_xfer_len(unsigned long wanted_len,
+-                                      Scsi_Cmnd *cmd, int write_flag);
+-#endif
+-static irqreturn_t scsi_tt_intr(int irq, void *dummy);
+-static irqreturn_t scsi_falcon_intr(int irq, void *dummy);
+-static void falcon_release_lock_if_possible(struct NCR5380_hostdata 
*hostdata);
+-static void falcon_get_lock(void);
++static int scsi_dma_is_ignored_buserr( unsigned char dma_stat );
++static void atari_scsi_fetch_restbytes( void );
++static long atari_scsi_dma_residual( struct Scsi_Host *instance );
++static int falcon_classify_cmd( Scsi_Cmnd *cmd );
++static unsigned long atari_dma_xfer_len( unsigned long wanted_len,
++                                         Scsi_Cmnd *cmd, int write_flag );
++#endif
++static irqreturn_t scsi_tt_intr( int irq, void *dummy);
++static irqreturn_t scsi_falcon_intr( int irq, void *dummy);
++static void falcon_release_lock_if_possible( struct NCR5380_hostdata *
++                                             hostdata );
++static int falcon_get_lock( void );
+ #ifdef CONFIG_ATARI_SCSI_RESET_BOOT
+ static void atari_scsi_reset_boot(void);
+ #endif
+@@ -523,7 +524,9 @@
+               }
+               falcon_got_lock = 0;
+               stdma_release();
+-              wake_up(&falcon_fairness_wait);
++#if defined(FALCON_FAIRNESS_WAIT)
++              wake_up( &falcon_fairness_wait );
++#endif
+       }
+ 
+       local_irq_restore(flags);
+@@ -544,21 +547,38 @@
+  * Complicated, complicated.... Sigh...
+  */
+ 
+-static void falcon_get_lock(void)
++/* MSch 20061229: atari_queue_command gets called from softirq context quite
++ * heavily in the 2.6 kernel series. Since atari_queue_command might need to 
++ * sleep in order to grab the ST-DMA lock, I have modified falcon_get_lock to 
++ * immediately return with error status if called in softirq context with the 
++ * lock not currently held by the SCSI driver, and the ST-DMA locked by some 
++ * other driver. atari_queue_command then returns SCSI_MLQUEUE_HOST_BUSY and 
++ * prevents further commands from issueing. 
++ */
++
++static int falcon_get_lock(void)
+ {
+       unsigned long flags;
+ 
+       if (IS_A_TT())
+-              return;
++              return 0;
+ 
+       local_irq_save(flags);
+ 
+-      while (!in_irq() && falcon_got_lock && stdma_others_waiting())
+-              sleep_on(&falcon_fairness_wait);
++#if defined (FALCON_FAIRNESS_WAIT)
++      while( !in_irq() && falcon_got_lock && stdma_others_waiting() )
++              sleep_on( &falcon_fairness_wait );
++#endif
+ 
+       while (!falcon_got_lock) {
+               if (in_irq())
+                       panic("Falcon SCSI hasn't ST-DMA lock in interrupt");
++              /* we may not sleep in soft interrupts neither, so bail out */
++              if (in_softirq() && stdma_islocked()) {
++                      printk(KERN_INFO "Falcon SCSI does not hold ST-DMA lock 
in softirq!\n" );
++                      local_irq_restore(flags);
++                      return 1;
++              }
+               if (!falcon_trying_lock) {
+                       falcon_trying_lock = 1;
+                       stdma_lock(scsi_falcon_intr, NULL);
+@@ -573,6 +593,8 @@
+       local_irq_restore(flags);
+       if (!falcon_got_lock)
+               panic("Falcon SCSI: someone stole the lock :-(\n");
++
++      return 0;
+ }
+ 
+ 
+@@ -845,7 +867,7 @@
+       } else {
+               atari_turnon_irq(IRQ_MFP_FSCSI);
+       }
+-      if ((rv & SCSI_RESET_ACTION) == SCSI_RESET_SUCCESS)
++      if (rv == SUCCESS) 
+               falcon_release_lock_if_possible(hostdata);
+ 
+       return rv;
+--- l/drivers/scsi/atari_NCR5380.c.org 2007-05-18 18:24:38.000000000 +0200
++++ l/drivers/scsi/atari_NCR5380.c     2007-05-20 21:29:39.000000000 +0200
+@@ -475,12 +475,13 @@
+       int cnt = 1;
+ #endif
+ 
+-      for (endaddr = virt_to_phys(cmd->SCp.ptr + cmd->SCp.this_residual - 1) 
+ 1;
+-           cmd->SCp.buffers_residual &&
+-           virt_to_phys(page_address(cmd->SCp.buffer[1].page) +
+-                        cmd->SCp.buffer[1].offset) == endaddr;) {
+-              MER_PRINTK("VTOP(%p) == %08lx -> merging\n",
+-                         page_address(cmd->SCp.buffer[1].page), endaddr);
++    for (endaddr = virt_to_phys(cmd->SCp.ptr + cmd->SCp.this_residual - 1) + 
1;
++       cmd->SCp.buffers_residual &&
++       virt_to_phys(page_address(cmd->SCp.buffer[1].page)+
++                    cmd->SCp.buffer[1].offset) == endaddr; ) {
++      MER_PRINTK("VTOP(%p) == %08lx -> merging\n",
++                 
page_address(cmd->SCp.buffer[1].page)+cmd->SCp.buffer[1].offset, 
++                 endaddr);
+ #if (NDEBUG & NDEBUG_MERGING)
+               ++cnt;
+ #endif
+@@ -998,6 +999,35 @@
+               }
+ #endif
+ 
++      local_irq_save(flags);
++      /* ++guenther: now that the issue queue is being set up, we can lock 
ST-DMA.
++       * Otherwise a running NCR5380_main may steal the lock.
++       * Lock before actually inserting due to fairness reasons explained in
++       * atari_scsi.c. If we insert first, then it's impossible for this 
driver
++       * to release the lock.
++       * Stop timer for this command while waiting for the lock, or timeouts
++       * may happen (and they really do), and it's no good if the command 
doesn't
++       * appear in any of the queues.
++       * ++roman: Just disabling the NCR interrupt isn't sufficient here,
++       * because also a timer int can trigger an abort or reset, which would
++       * alter queues and touch the lock.
++       */
++      if (!IS_A_TT()) {
++              int rv;
++              /* MSch: since we get called from softirq context here, and 
cannot 
++               * sleep safely, the return status of falcon_get_lock is now 
used to
++               * figure out if we could successfully lock, or need to bail 
out. 
++               * Signal the midlevel we're unable to queue the command in 
this case. 
++               */ 
++              oldto = atari_scsi_update_timeout(cmd, 0);
++              rv = falcon_get_lock();
++              atari_scsi_update_timeout(cmd, oldto);
++              if (rv) {
++                      local_irq_restore(flags);
++                      return SCSI_MLQUEUE_HOST_BUSY;
++              }
++      }
++
+       /*
+        * We use the host_scribble field as a pointer to the next command
+        * in a queue
+@@ -1015,24 +1045,6 @@
+        * sense data is only guaranteed to be valid while the condition exists.
+        */
+ 
+-      local_irq_save(flags);
+-      /* ++guenther: now that the issue queue is being set up, we can lock 
ST-DMA.
+-       * Otherwise a running NCR5380_main may steal the lock.
+-       * Lock before actually inserting due to fairness reasons explained in
+-       * atari_scsi.c. If we insert first, then it's impossible for this 
driver
+-       * to release the lock.
+-       * Stop timer for this command while waiting for the lock, or timeouts
+-       * may happen (and they really do), and it's no good if the command 
doesn't
+-       * appear in any of the queues.
+-       * ++roman: Just disabling the NCR interrupt isn't sufficient here,
+-       * because also a timer int can trigger an abort or reset, which would
+-       * alter queues and touch the lock.
+-       */
+-      if (!IS_A_TT()) {
+-              oldto = atari_scsi_update_timeout(cmd, 0);
+-              falcon_get_lock();
+-              atari_scsi_update_timeout(cmd, oldto);
+-      }
+       if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
+               LIST(cmd, hostdata->issue_queue);
+               SET_NEXT(cmd, hostdata->issue_queue);
+@@ -1056,10 +1068,9 @@
+        * If we're not in an interrupt, we can call NCR5380_main()
+        * unconditionally, because it cannot be already running.
+        */
+-      if (in_interrupt() || ((flags >> 8) & 7) >= 6)
+-              queue_main();
+-      else
+-              NCR5380_main(NULL);
++
++      queue_main();
++
+       return 0;
+ }
+ 
+@@ -2681,7 +2692,7 @@
+  *    host byte of the result field to, if zero DID_ABORTED is
+  *    used.
+  *
+- * Returns : 0 - success, -1 on failure.
++ * Returns : SUCCESS - success, FAILED on failure.
+  *
+  * XXX - there is no way to abort the command that is currently
+  *     connected, you have to wait for it to complete.  If this is
+@@ -2751,11 +2762,11 @@
+                       local_irq_restore(flags);
+                       cmd->scsi_done(cmd);
+                       falcon_release_lock_if_possible(hostdata);
+-                      return SCSI_ABORT_SUCCESS;
++                      return SUCCESS;
+               } else {
+ /*                    local_irq_restore(flags); */
+                       printk("scsi%d: abort of connected command failed!\n", 
HOSTNO);
+-                      return SCSI_ABORT_ERROR;
++                      return FAILED;
+               }
+       }
+ #endif
+@@ -2779,7 +2790,7 @@
+                        * yet... */
+                       tmp->scsi_done(tmp);
+                       falcon_release_lock_if_possible(hostdata);
+-                      return SCSI_ABORT_SUCCESS;
++                      return SUCCESS;
+               }
+       }
+ 
+@@ -2797,7 +2808,7 @@
+       if (hostdata->connected) {
+               local_irq_restore(flags);
+               ABRT_PRINTK("scsi%d: abort failed, command connected.\n", 
HOSTNO);
+-              return SCSI_ABORT_SNOOZE;
++              return FAILED;
+       }
+ 
+       /*
+@@ -2832,7 +2843,7 @@
+                       ABRT_PRINTK("scsi%d: aborting disconnected command.\n", 
HOSTNO);
+ 
+                       if (NCR5380_select(instance, cmd, (int)cmd->tag))
+-                              return SCSI_ABORT_BUSY;
++                              return FAILED;
+ 
+                       ABRT_PRINTK("scsi%d: nexus reestablished.\n", HOSTNO);
+ 
+@@ -2859,7 +2870,7 @@
+                                       local_irq_restore(flags);
+                                       tmp->scsi_done(tmp);
+                                       
falcon_release_lock_if_possible(hostdata);
+-                                      return SCSI_ABORT_SUCCESS;
++                                      return SUCCESS;
+                               }
+                       }
+               }
+@@ -2885,7 +2896,7 @@
+        */
+       falcon_release_lock_if_possible(hostdata);
+ 
+-      return SCSI_ABORT_NOT_RUNNING;
++      return SUCCESS;
+ }
+ 
+ 
+@@ -2894,7 +2905,7 @@
+  *
+  * Purpose : reset the SCSI bus.
+  *
+- * Returns : SCSI_RESET_WAKEUP
++ * Returns : SUCCESS
+  *
+  */
+ 
+@@ -2984,7 +2995,7 @@
+        * the midlevel code that the reset was SUCCESSFUL, and there is no
+        * need to 'wake up' the commands by a request_sense
+        */
+-      return SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET;
++      return SUCCESS;
+ #else /* 1 */
+ 
+       /* MSch: new-style reset handling: let the mid-level do what it can */
+@@ -3032,6 +3043,6 @@
+       local_irq_restore(flags);
+ 
+       /* we did no complete reset of all commands, so a wakeup is required */
+-      return SCSI_RESET_WAKEUP | SCSI_RESET_BUS_RESET;
++      return SUCCESS;
+ #endif /* 1 */
+ }

Added: 
dists/sid/linux-2.6/debian/patches/bugfix/m68k/debian-2.6.21-2-rom-isa.diff
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/debian-2.6.21-2-rom-isa.diff 
Mon May 21 19:39:35 2007
@@ -0,0 +1,84 @@
+--- l/include/asm-m68k/io.h.org        2007-05-18 18:24:41.000000000 +0200
++++ l/include/asm-m68k/io.h    2007-05-18 21:57:22.000000000 +0200
+@@ -245,9 +245,16 @@
+ #if defined(CONFIG_ATARI_ROM_ISA)
+ #define isa_rom_inb(port)      rom_in_8(isa_itb(port))
+ #define isa_rom_inw(port)      (ISA_SEX ? rom_in_be16(isa_itw(port)) : 
rom_in_le16(isa_itw(port)))
++#define isa_rom_inl(port)      (ISA_SEX ? rom_in_be32(isa_itw(port)) : 
rom_in_le32(isa_itw(port)))
+ 
+ #define isa_rom_outb(val,port) rom_out_8(isa_itb(port),(val))
+ #define isa_rom_outw(val,port) (ISA_SEX ? rom_out_be16(isa_itw(port),(val)) : 
rom_out_le16(isa_itw(port),(val)))
++#define isa_rom_outl(val,port) (ISA_SEX ? rom_out_be32(isa_itw(port),(val)) : 
rom_out_le32(isa_itw(port),(val)))
++
++#define isa_rom_readb(p)       rom_in_8(isa_mtb((unsigned long)(p)))
++#define isa_rom_readw(p)       \
++      (ISA_SEX ? rom_in_be16(isa_mtw((unsigned long)(p)))     \
++               : rom_in_le16(isa_mtw((unsigned long)(p))))
+ 
+ #define isa_rom_writeb(val,p)  rom_out_8(isa_mtb((unsigned long)(p)),(val))
+ #define isa_rom_writew(val,p)  \
+@@ -315,12 +322,20 @@
+        (ISA_SEX ? raw_rom_insw(isa_itw(port), (u16 *)(buf), (nr)) :    \
+                   raw_rom_insw_swapw(isa_itw(port), (u16 *)(buf), (nr)))
+ 
++#define isa_rom_insl(port, buf, nr)     \
++       (ISA_SEX ? raw_rom_insl(isa_itw(port), (u32 *)(buf), (nr)) :    \
++                  raw_rom_insw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1))
++
+ #define isa_rom_outsb(port, buf, nr) raw_rom_outsb(isa_itb(port), (u8 
*)(buf), (nr))
+ 
+ #define isa_rom_outsw(port, buf, nr)    \
+        (ISA_SEX ? raw_rom_outsw(isa_itw(port), (u16 *)(buf), (nr)) :  \
+                   raw_rom_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)))
+ 
++#define isa_rom_outsl(port, buf, nr)    \
++       (ISA_SEX ? raw_rom_outsl(isa_itw(port), (u32 *)(buf), (nr)) :  \
++                  raw_rom_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1))
++
+ #endif
+ 
+ #endif  /* CONFIG_ISA */
+@@ -421,8 +436,16 @@
+ 
+ #define insb    isa_rom_insb
+ #define insw    isa_rom_insw
++#define insl    isa_rom_insl
+ #define outsb   isa_rom_outsb
+ #define outsw   isa_rom_outsw
++#define outsl   isa_rom_outsl
++
++#define readb   isa_readb
++#define readw   isa_readw
++#define writeb  isa_writeb
++#define writew  isa_writew
++
+ #endif
+ 
+ #if !defined(CONFIG_ISA) && !defined(CONFIG_PCI) && 
!defined(CONFIG_ATARI_ROM_ISA)
+--- l/include/asm-m68k/raw_io.h.org    2007-05-18 18:24:41.000000000 +0200
++++ l/include/asm-m68k/raw_io.h        2007-05-19 08:58:33.000000000 +0200
+@@ -436,6 +436,24 @@
+       for (i = 0; i < nr; i++)
+               rom_out_le16(port, *buf++);
+ }
++
++static inline void raw_rom_insl(volatile u16 __iomem *port, u32 *buf,
++                                 unsigned int nr)
++{
++      unsigned int i;
++
++      for (i = 0; i < nr; i++)
++              *buf++ = rom_in_be32(port);
++}
++
++static inline void raw_rom_outsl(volatile u16 __iomem *port, const u32 *buf,
++                                 unsigned int nr)
++{
++      unsigned int i;
++
++      for (i = 0; i < nr; i++)
++              rom_out_be32(port, *buf++);
++}
+ #endif /* CONFIG_ATARI_ROM_ISA */
+ 
+ #endif /* __KERNEL__ */

_______________________________________________
Kernel-svn-changes mailing list
Kernel-svn-changes@lists.alioth.debian.org
http://lists.alioth.debian.org/mailman/listinfo/kernel-svn-changes

Reply via email to