Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2fe2023a authored by Stefan Richter's avatar Stefan Richter
Browse files

firewire: revert to 4 GB RDMA, fix protocols using Memory Space

Undo a feature introduced in v3.14 by commit fcd46b34
"firewire: Enable remote DMA above 4 GB".  That change raised the
minimum address at which protocol drivers and user programs can register
for request reception from 0x0001'0000'0000 to 0x8000'0000'0000.
It turned out that at least one vendor-specific protocol exists which
uses lower addresses:  https://bugzilla.kernel.org/show_bug.cgi?id=76921



For the time being, revert most of commit fcd46b34 so that affected
protocols work like with kernel v3.13 and before.  Just keep the valid
documentation parts from the regressing commit, and the ability to
identify controllers which could be programmed to accept >32 bit
physical DMA addresses.  The rest of fcd46b34 should probably be
brought back as an optional instead of default feature.

Reported-by: default avatarFabien Spindler <fabien.spindler@inria.fr>
Cc: <stable@vger.kernel.org> # 3.14+
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent c7208164
Loading
Loading
Loading
Loading
+8 −5
Original line number Original line Diff line number Diff line
@@ -25,9 +25,11 @@ using data transfer rates in the order of 10MB/s or more.
With most FireWire controllers, memory access is limited to the low 4 GB
With most FireWire controllers, memory access is limited to the low 4 GB
of physical address space.  This can be a problem on IA64 machines where
of physical address space.  This can be a problem on IA64 machines where
memory is located mostly above that limit, but it is rarely a problem on
memory is located mostly above that limit, but it is rarely a problem on
more common hardware such as x86, x86-64 and PowerPC.  However, at least
more common hardware such as x86, x86-64 and PowerPC.
Agere/LSI FW643e and FW643e2 controllers are known to support access to

physical addresses above 4 GB.
At least LSI FW643e and FW643e2 controllers are known to support access to
physical addresses above 4 GB, but this feature is currently not enabled by
Linux.


Together with a early initialization of the OHCI-1394 controller for debugging,
Together with a early initialization of the OHCI-1394 controller for debugging,
this facility proved most useful for examining long debugs logs in the printk
this facility proved most useful for examining long debugs logs in the printk
@@ -101,8 +103,9 @@ Step-by-step instructions for using firescope with early OHCI initialization:
   compliant, they are based on TI PCILynx chips and require drivers for Win-
   compliant, they are based on TI PCILynx chips and require drivers for Win-
   dows operating systems.
   dows operating systems.


   The mentioned kernel log message contains ">4 GB phys DMA" in case of
   The mentioned kernel log message contains the string "physUB" if the
   OHCI-1394 controllers which support accesses above this limit.
   controller implements a writable Physical Upper Bound register.  This is
   required for physical DMA above 4 GB (but not utilized by Linux yet).


2) Establish a working FireWire cable connection:
2) Establish a working FireWire cable connection:


+2 −2
Original line number Original line Diff line number Diff line
@@ -237,8 +237,8 @@ static inline bool is_next_generation(int new_generation, int old_generation)


#define LOCAL_BUS 0xffc0
#define LOCAL_BUS 0xffc0


/* arbitrarily chosen maximum range for physical DMA: 128 TB */
/* OHCI-1394's default upper bound for physical DMA: 4 GB */
#define FW_MAX_PHYSICAL_RANGE		(128ULL << 40)
#define FW_MAX_PHYSICAL_RANGE		(1ULL << 32)


void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
+1 −1
Original line number Original line Diff line number Diff line
@@ -3716,7 +3716,7 @@ static int pci_probe(struct pci_dev *dev,
		    version >> 16, version & 0xff, ohci->card.index,
		    version >> 16, version & 0xff, ohci->card.index,
		    ohci->n_ir, ohci->n_it, ohci->quirks,
		    ohci->n_ir, ohci->n_it, ohci->quirks,
		    reg_read(ohci, OHCI1394_PhyUpperBound) ?
		    reg_read(ohci, OHCI1394_PhyUpperBound) ?
			", >4 GB phys DMA" : "");
			", physUB" : "");


	return 0;
	return 0;