XMMUpstreaming » History » Version 12
Denis 'GNUtoo' Carikli, 02/10/2022 05:01 PM
mention where padding is added
1 | 1 | Denis 'GNUtoo' Carikli | h1. XMMUpstreaming |
---|---|---|---|
2 | |||
3 | {{toc}} |
||
4 | |||
5 | h2. Analysis of Replicant 9 Linux 5.2 modem branch |
||
6 | |||
7 | These were cleaned up and ported from forkbomb's code: |
||
8 | <pre> |
||
9 | b4c2df98ed6f misc: xmm6262: Add Samsung IPC USB modem firmware download module |
||
10 | 77b55273bd6e net: usb: add Samsung IPC-over-HSIC driver |
||
11 | f9ae2d1697fa net: add Samsung IPC interface driver |
||
12 | 7806adad4507 HACK: usb: host: ehci-exynos: add ehci_power sysfs node |
||
13 | 82c317b0da5e HACK: add modem power on/off driver |
||
14 | 28e5b460f920 HACK: usb: ehci_exynos: enable OHCI_SUSP_LEGACY |
||
15 | e7c122b770c1 ARM: dts: EXYNOS: add 3G modem nodes to midas boards |
||
16 | c3201527f7ea ARM: dts: split Exynos 4412 N710x boards up |
||
17 | 5b55f03cda8c ARM: dts: EXYNOS: add Samsung IPC modem support |
||
18 | eca381876d5e ARM: dts: EXYNOS: enable HSIC0 on midas boards |
||
19 | 7ec9129e3221 replicant_*_defconfig: extend cmdline to get IMSI and other information |
||
20 | 54c196380507 replicant_*_defconfig: Add modem support |
||
21 | [...] |
||
22 | 0ecfebd2b524 Linux 5.2 |
||
23 | </pre> |
||
24 | |||
25 | If we look at the drivers only (not the dts or config changes, or hacks in pre-existing code, we are left with): |
||
26 | <pre> |
||
27 | b4c2df98ed6f misc: xmm6262: Add Samsung IPC USB modem firmware download module |
||
28 | 77b55273bd6e net: usb: add Samsung IPC-over-HSIC driver |
||
29 | f9ae2d1697fa net: add Samsung IPC interface driver |
||
30 | 82c317b0da5e HACK: add modem power on/off driver |
||
31 | </pre> |
||
32 | |||
33 | We'd also need to find a way to fix these: |
||
34 | <pre> |
||
35 | 7806adad4507 HACK: usb: host: ehci-exynos: add ehci_power sysfs node |
||
36 | 28e5b460f920 HACK: usb: ehci_exynos: enable OHCI_SUSP_LEGACY |
||
37 | </pre> |
||
38 | |||
39 | |||
40 | So we'd probably need to have something like that instead: |
||
41 | 3 | Denis 'GNUtoo' Carikli | 1. A driver for the SIPC (Samsung IPC) protocol (f9ae2d1697fa net: add Samsung IPC interface driver) |
42 | 2. A driver for the SIPC (Samsung IPC) transport on top of HSIC and the protocol (77b55273bd6e net: usb: add Samsung IPC-over-HSIC driver). |
||
43 | 1 | Denis 'GNUtoo' Carikli | 3. A modem driver with: |
44 | ** The GPIO handling like drivers/hsi/clients/nokia-modem.c (some GPIOs probably cannot be handled in userspace like gpio_pda_active (see [[XMMBoot#GPIOs-usage]] for more details) (82c317b0da5e HACK: add modem power on/off driver) |
||
45 | ** The firmware loading code (b4c2df98ed6f misc: xmm6262: Add Samsung IPC USB modem firmware download module) |
||
46 | 5 | Denis 'GNUtoo' Carikli | ** Probably some of the hacks here. For instance GPIO input IRQ -> hsic bus reset |
47 | 4 | Denis 'GNUtoo' Carikli | |
48 | So we have: Userspace <-> SIPC protocol <-> SIPC transport <-> HSIC |
||
49 | |||
50 | However I'm not sure about certain things: |
||
51 | * The SIPC protocol is huge and has different userspace interfaces. Maybe it could be split? |
||
52 | * The SIPC transport driver uses an USB id table (the modem ID once booted). => Should we keep the IDs in it or move them in the modem driver instead? |
||
53 | 6 | Denis 'GNUtoo' Carikli | |
54 | 7 | Denis 'GNUtoo' Carikli | Also look at the motorolla cpcap driver for the droid4. The architecture is different though: While it uses USB, it's tied to Qualcomm modem drivers (CDC) which probably doesn't have a specific protocol beside the multiplexing of the UART lines and network interfaces, though CDC could be seen as a specific protocol |
55 | 9 | Denis 'GNUtoo' Carikli | |
56 | h2. Analysis of the architecture of the drivers made by Simon Shields |
||
57 | |||
58 | Simon Shields wrote some drivers that work on top of upstream Linux and that were made to work in at least two conditions: |
||
59 | * With the Replicant 11 kernel under Parabola and with Simon Shields patches for libsamsung-ipc being reworked/rebased |
||
60 | * With a Galaxy S as part of some other project (PostmarketOS ?) (TODO: Add mailing list link and reference) |
||
61 | |||
62 | h3. Firmware loading and GPIO driver |
||
63 | |||
64 | TODO |
||
65 | |||
66 | h3. Main drivers |
||
67 | |||
68 | h4. Write to /dev/umts_ipc |
||
69 | |||
70 | <pre> |
||
71 | 12 | Denis 'GNUtoo' Carikli | +----------------+ +---------------+ +--------------+ |
72 | | libsamsung-ipc | -----> | /dev/umts_ipc | -----> drivers/net/sipc/miscdev.c: .write -> sipc_misc_write( [...] ) { [...] // enqueue data to tx_queue_raw + add padding [....] } -> | tx_queue_raw | |
||
73 | +----------------+ +---------------+ +--------------+ |
||
74 | 11 | Denis 'GNUtoo' Carikli | </pre> |
75 | |||
76 | <pre> |
||
77 | +--------------+ |
||
78 | | tx_queue_raw | -----> | dequeue in drivers/net/sipc/core.c in sipc_tx_work ( [...] ) { [...] sipc_do_tx( [...] ); [...] } -----> sipc_do_tx( [...] ep->transmit() [...] ); |
||
79 | +--------------+ |
||
80 | </pre> |
||
81 | |||
82 | <pre> |
||
83 | +-------------+ |
||
84 | | .transmit() | -----> sipc_link_transmit( [...], struct sk_buff *skb ) { [...] // configure the USB as sndbulkpipe for sending a bulk pipe and sends the skb } |
||
85 | +-------------+ ^ |
||
86 | | |
||
87 | |+--Setup in sipc_probe() |
||
88 | 9 | Denis 'GNUtoo' Carikli | </pre> |