瀏覽代碼

firewire: ohci: do not clear PHY interrupt status inadvertently

The interrupt status bits in PHY register 5 are cleared by writing a one
bit.  To avoid clearing them unadvertently, do not write them back when
they were read as set, but only when they have been explicitly requested
to be set.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Clemens Ladisch 15 年之前
父節點
當前提交
e7014dada0
共有 2 個文件被更改,包括 8 次插入0 次删除
  1. 1 0
      drivers/firewire/core.h
  2. 7 0
      drivers/firewire/ohci.c

+ 1 - 0
drivers/firewire/core.h

@@ -28,6 +28,7 @@ struct fw_packet;
 #define PHY_CONTENDER		0x40
 #define PHY_CONTENDER		0x40
 #define PHY_BUS_RESET		0x40
 #define PHY_BUS_RESET		0x40
 #define PHY_BUS_SHORT_RESET	0x40
 #define PHY_BUS_SHORT_RESET	0x40
+#define PHY_INT_STATUS_BITS	0x3c
 
 
 #define BANDWIDTH_AVAILABLE_INITIAL	4915
 #define BANDWIDTH_AVAILABLE_INITIAL	4915
 #define BROADCAST_CHANNEL_INITIAL	(1 << 31 | 31)
 #define BROADCAST_CHANNEL_INITIAL	(1 << 31 | 31)

+ 7 - 0
drivers/firewire/ohci.c

@@ -490,6 +490,13 @@ static int ohci_update_phy_reg(struct fw_card *card, int addr,
 	if (err < 0)
 	if (err < 0)
 		return err;
 		return err;
 
 
+	/*
+	 * The interrupt status bits are cleared by writing a one bit.
+	 * Avoid clearing them unless explicitly requested in set_bits.
+	 */
+	if (addr == 5)
+		clear_bits |= PHY_INT_STATUS_BITS;
+
 	old = (old & ~clear_bits) | set_bits;
 	old = (old & ~clear_bits) | set_bits;
 	reg_write(ohci, OHCI1394_PhyControl,
 	reg_write(ohci, OHCI1394_PhyControl,
 		  OHCI1394_PhyControl_Write(addr, old));
 		  OHCI1394_PhyControl_Write(addr, old));