From: Andrey Panin <pazke@orbita.don.sitek.net>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] net drivers check_region() removal continues
Date: Wed, 8 Nov 2000 18:05:17 +0300 [thread overview]
Message-ID: <20001108180517.B4729@debian> (raw)
[-- Attachment #1: Type: text/plain, Size: 139 bytes --]
Hi all,
lots of patches attached:
3c503.c, ac3200.c, cs89x0.c, e2100.c, hp.c, hp-plus.c, lne390.c, ne.c, wd.c
Best regards,
Andrey
[-- Attachment #2: patch-3c503 --]
[-- Type: text/plain, Size: 3822 bytes --]
diff -urN /mnt/disk/linux/drivers/net/3c503.c /linux/drivers/net/3c503.c
--- /mnt/disk/linux/drivers/net/3c503.c Thu Nov 2 22:00:58 2000
+++ /linux/drivers/net/3c503.c Mon Nov 6 01:20:40 2000
@@ -101,8 +101,6 @@
break;
if (base_bits != 1)
continue;
- if (check_region(netcard_portlist[i], EL2_IO_EXTENT))
- continue;
if (el2_probe1(dev, netcard_portlist[i]) == 0)
return 0;
}
@@ -126,13 +124,9 @@
else if (base_addr != 0) /* Don't probe at all. */
return -ENXIO;
- for (i = 0; netcard_portlist[i]; i++) {
- int ioaddr = netcard_portlist[i];
- if (check_region(ioaddr, EL2_IO_EXTENT))
- continue;
- if (el2_probe1(dev, ioaddr) == 0)
+ for (i = 0; netcard_portlist[i]; i++)
+ if (el2_probe1(dev, netcard_portlist[i]) == 0)
return 0;
- }
return -ENODEV;
}
@@ -143,14 +137,18 @@
int __init
el2_probe1(struct net_device *dev, int ioaddr)
{
- int i, iobase_reg, membase_reg, saved_406, wordlength;
- static unsigned version_printed = 0;
+ int i, iobase_reg, membase_reg, saved_406, wordlength, retval;
+ static unsigned version_printed;
unsigned long vendor_id;
+ if (!request_region(ioaddr, EL2_IO_EXTENT, dev->name))
+ return -EBUSY;
+
/* Reset and/or avoid any lurking NE2000 */
if (inb(ioaddr + 0x408) == 0xff) {
mdelay(1);
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
/* We verify that it's a 3C503 board by checking the first three octets
@@ -160,7 +158,8 @@
/* ASIC location registers should be 0 or have only a single bit set. */
if ( (iobase_reg & (iobase_reg - 1))
|| (membase_reg & (membase_reg - 1))) {
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
saved_406 = inb_p(ioaddr + 0x406);
outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406); /* Reset it... */
@@ -172,7 +171,8 @@
if ((vendor_id != OLD_3COM_ID) && (vendor_id != NEW_3COM_ID)) {
/* Restore the register we frobbed. */
outb(saved_406, ioaddr + 0x406);
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
if (ei_debug && version_printed++ == 0)
@@ -182,8 +182,9 @@
/* Allocate dev->priv and fill in 8390 specific dev fields. */
if (ethdev_init(dev)) {
printk ("3c503: unable to allocate memory for dev->priv.\n");
- return -ENOMEM;
- }
+ retval = -ENOMEM;
+ goto out;
+ }
printk("%s: 3c503 at i/o base %#3x, node ", dev->name, ioaddr);
@@ -282,8 +283,6 @@
ei_status.block_input = &el2_block_input;
ei_status.block_output = &el2_block_output;
- request_region(ioaddr, EL2_IO_EXTENT, ei_status.name);
-
if (dev->irq == 2)
dev->irq = 9;
else if (dev->irq > 5 && dev->irq != 9) {
@@ -310,11 +309,15 @@
dev->name, ei_status.name, (wordlength+1)<<3);
}
return 0;
+out:
+ release_region(ioaddr, EL2_IO_EXTENT);
+ return retval;
}
\f
static int
el2_open(struct net_device *dev)
{
+ int retval = -EAGAIN;
if (dev->irq < 2) {
int irqlist[] = {5, 9, 3, 4, 0};
@@ -327,18 +330,19 @@
autoirq_setup(0);
outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR);
outb_p(0x00, E33G_IDCFR);
- if (*irqp == autoirq_report(0) /* It's a good IRQ line! */
- && request_irq (dev->irq = *irqp, ei_interrupt, 0, ei_status.name, dev) == 0)
+ if (*irqp == autoirq_report(0) /* It's a good IRQ line! */
+ && ((retval = request_irq(dev->irq = *irqp,
+ ei_interrupt, 0, dev->name, dev)) == 0))
break;
}
} while (*++irqp);
if (*irqp == 0) {
outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */
- return -EAGAIN;
+ return retval;
}
} else {
- if (request_irq(dev->irq, ei_interrupt, 0, ei_status.name, dev)) {
- return -EAGAIN;
+ if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
+ return retval;
}
}
[-- Attachment #3: patch-ac3200 --]
[-- Type: text/plain, Size: 1137 bytes --]
diff -urN /mnt/disk/linux/drivers/net/ac3200.c /linux/drivers/net/ac3200.c
--- /mnt/disk/linux/drivers/net/ac3200.c Thu Nov 2 22:01:00 2000
+++ /linux/drivers/net/ac3200.c Mon Nov 6 18:45:54 2000
@@ -121,8 +118,8 @@
{
int i, retval;
- if (!request_region(ioaddr, AC_IO_EXTENT, "ac3200"))
- return -ENODEV;
+ if (!request_region(ioaddr, AC_IO_EXTENT, dev->name))
+ return -EBUSY;
if (inb_p(ioaddr + AC_ID_PORT) == 0xff) {
retval = -ENODEV;
@@ -172,9 +169,8 @@
printk(", assigning");
}
- if (request_irq(dev->irq, ei_interrupt, 0, "ac3200", dev)) {
+ if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
printk (" nothing! Unable to get IRQ %d.\n", dev->irq);
- retval = -EAGAIN;
goto out1;
}
@@ -260,11 +256,13 @@
static int ac_open(struct net_device *dev)
{
#ifdef notyet
+ int retval;
+
/* Someday we may enable the IRQ and shared memory here. */
int ioaddr = dev->base_addr;
- if (request_irq(dev->irq, ei_interrupt, 0, "ac3200", dev))
- return -EAGAIN;
+ if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev)))
+ return retval;
#endif
ei_open(dev);
[-- Attachment #4: patch-cs89x0 --]
[-- Type: text/plain, Size: 1726 bytes --]
diff -urN /mnt/disk/linux/drivers/net/cs89x0.c /linux/drivers/net/cs89x0.c
--- /mnt/disk/linux/drivers/net/cs89x0.c Thu Nov 2 22:01:00 2000
+++ /linux/drivers/net/cs89x0.c Mon Nov 6 18:58:00 2000
@@ -378,8 +378,8 @@
lp = (struct net_local *)dev->priv;
/* Grab the region so we can find another board if autoIRQ fails. */
- if (!request_region(ioaddr, NETCARD_IO_EXTENT, "cs89x0")) {
- retval = -ENODEV;
+ if (!request_region(ioaddr, NETCARD_IO_EXTENT, dev->name)) {
+ retval = -EBUSY;
goto out1;
}
@@ -1028,10 +1028,10 @@
writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
for (i = 2; i < CS8920_NO_INTS; i++) if ((1 << dev->irq) & lp->irq_map) {
- if (request_irq (i, NULL, 0, "cs89x0", dev) != -EBUSY) {
+ if (request_irq (i, NULL, 0, dev->name, dev) != -EBUSY) {
write_irq(dev, lp->chip_type, i);
writereg(dev, PP_BufCFG, GENERATE_SW_INTERRUPT);
- if (request_irq (dev->irq = i, &net_interrupt, 0, "cs89x0", dev) == 0)
+ if (request_irq (dev->irq = i, &net_interrupt, 0, dev->name, dev) == 0)
break;
}
}
@@ -1058,7 +1058,7 @@
writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
#endif
write_irq(dev, lp->chip_type, dev->irq);
- if (request_irq(dev->irq, &net_interrupt, 0, "cs89x0", dev)) {
+ if (request_irq(dev->irq, &net_interrupt, 0, dev->name, dev)) {
if (net_debug)
printk("cs89x0: request_irq(%d) failed\n", dev->irq);
ret = -EAGAIN;
@@ -1089,7 +1089,7 @@
goto release_irq;
}
memset(lp->dma_buff, 0, lp->dmasize * 1024); /* Why? */
- if (request_dma(dev->dma, "cs89x0")) {
+ if (request_dma(dev->dma, dev->name)) {
printk(KERN_ERR "%s: cannot get dma channel %d\n", dev->name, dev->dma);
goto release_irq;
}
[-- Attachment #5: patch-e2100 --]
[-- Type: text/plain, Size: 936 bytes --]
diff -urN /mnt/disk/linux/drivers/net/e2100.c /linux/drivers/net/e2100.c
--- /mnt/disk/linux/drivers/net/e2100.c Thu Nov 2 22:01:00 2000
+++ /linux/drivers/net/e2100.c Mon Nov 6 18:59:33 2000
@@ -140,8 +140,8 @@
unsigned char *station_addr = dev->dev_addr;
static unsigned version_printed = 0;
- if (!request_region(ioaddr, E21_IO_EXTENT, "e2100"))
- return -ENODEV;
+ if (!request_region(ioaddr, E21_IO_EXTENT, dev->name))
+ return -EBUSY;
/* First check the station address for the Ctron prefix. */
if (inb(ioaddr + E21_SAPROM + 0) != 0x00
@@ -255,10 +255,10 @@
e21_open(struct net_device *dev)
{
short ioaddr = dev->base_addr;
+ int retval;
- if (request_irq(dev->irq, ei_interrupt, 0, "e2100", dev)) {
- return -EBUSY;
- }
+ if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev)))
+ return retval;
/* Set the interrupt line and memory base on the hardware. */
inb(ioaddr + E21_IRQ_LOW);
[-- Attachment #6: patch-hp --]
[-- Type: text/plain, Size: 1323 bytes --]
diff -urN /mnt/disk/linux/drivers/net/hp.c /linux/drivers/net/hp.c
--- /mnt/disk/linux/drivers/net/hp.c Thu Nov 2 22:00:58 2000
+++ /linux/drivers/net/hp.c Mon Nov 6 19:06:29 2000
@@ -101,10 +101,10 @@
{
int i, retval, board_id, wordmode;
const char *name;
- static unsigned version_printed = 0;
+ static unsigned version_printed;
- if (!request_region(ioaddr, HP_IO_EXTENT, "hp"))
- return -ENODEV;
+ if (!request_region(ioaddr, HP_IO_EXTENT, dev->name))
+ return -EBUSY;
/* Check for the HP physical address, 08 00 09 xx xx xx. */
/* This really isn't good enough: we may pick up HP LANCE boards
@@ -155,7 +155,7 @@
outb_p(irqmap[irq] | HP_RUN, ioaddr + HP_CONFIGURE);
outb_p( 0x00 | HP_RUN, ioaddr + HP_CONFIGURE);
if (irq == autoirq_report(0) /* It's a good IRQ line! */
- && request_irq (irq, ei_interrupt, 0, "hp", dev) == 0) {
+ && request_irq (irq, ei_interrupt, 0, dev->name, dev) == 0) {
printk(" selecting IRQ %d.\n", irq);
dev->irq = *irqp;
break;
@@ -170,9 +170,8 @@
} else {
if (dev->irq == 2)
dev->irq = 9;
- if (request_irq(dev->irq, ei_interrupt, 0, "hp", dev)) {
+ if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
printk (" unable to get IRQ %d.\n", dev->irq);
- retval = -EBUSY;
goto out1;
}
}
[-- Attachment #7: patch-hp-plus --]
[-- Type: text/plain, Size: 945 bytes --]
diff -urN /mnt/disk/linux/drivers/net/hp-plus.c /linux/drivers/net/hp-plus.c
--- /mnt/disk/linux/drivers/net/hp-plus.c Thu Nov 2 22:01:00 2000
+++ /linux/drivers/net/hp-plus.c Mon Nov 6 00:51:11 2000
@@ -141,10 +141,10 @@
unsigned char checksum = 0;
const char *name = "HP-PC-LAN+";
int mem_start;
- static unsigned version_printed = 0;
+ static unsigned version_printed;
- if (!request_region(ioaddr, HP_IO_EXTENT, "hp-plus"))
- return -ENODEV;
+ if (!request_region(ioaddr, HP_IO_EXTENT, dev->name))
+ return -EBUSY;
/* Check for the HP+ signature, 50 48 0x 53. */
if (inw(ioaddr + HP_ID) != 0x4850
@@ -249,9 +249,10 @@
{
int ioaddr = dev->base_addr - NIC_OFFSET;
int option_reg;
+ int retval;
- if (request_irq(dev->irq, ei_interrupt, 0, "hp-plus", dev)) {
- return -EAGAIN;
+ if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
+ return retval;
}
/* Reset the 8390 and HP chip. */
[-- Attachment #8: patch-lne390 --]
[-- Type: text/plain, Size: 1177 bytes --]
diff -urN /mnt/disk/linux/drivers/net/lne390.c /linux/drivers/net/lne390.c
--- /mnt/disk/linux/drivers/net/lne390.c Thu Nov 2 22:01:06 2000
+++ /linux/drivers/net/lne390.c Mon Nov 6 19:10:14 2000
@@ -109,7 +109,7 @@
int ret;
if (ioaddr > 0x1ff) { /* Check a single specified location. */
- if (!request_region(ioaddr, LNE390_IO_EXTENT, "lne390"))
+ if (!request_region(ioaddr, LNE390_IO_EXTENT, dev->name))
return -EBUSY;
ret = lne390_probe1(dev, ioaddr);
if (ret)
@@ -128,7 +128,7 @@
/* EISA spec allows for up to 16 slots, but 8 is typical. */
for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
- if (!request_region(ioaddr, LNE390_IO_EXTENT, "lne390"))
+ if (!request_region(ioaddr, LNE390_IO_EXTENT, dev->name))
continue;
if (lne390_probe1(dev, ioaddr) == 0)
return 0;
@@ -195,11 +195,11 @@
}
printk(" IRQ %d,", dev->irq);
- if (request_irq(dev->irq, ei_interrupt, 0, "lne390", dev)) {
+ if ((ret = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
printk (" unable to get IRQ %d.\n", dev->irq);
kfree(dev->priv);
dev->priv = NULL;
- return -EAGAIN;
+ return ret;
}
if (dev->mem_start == 0) {
[-- Attachment #9: patch-ne --]
[-- Type: text/plain, Size: 3944 bytes --]
diff -urN /mnt/disk/linux/drivers/net/ne.c /linux/drivers/net/ne.c
--- /mnt/disk/linux/drivers/net/ne.c Thu Nov 2 22:00:58 2000
+++ /linux/drivers/net/ne.c Mon Nov 6 19:14:49 2000
@@ -133,7 +133,7 @@
#define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */
/* Non-zero only if the current card is a PCI with BIOS-set IRQ. */
-static unsigned int pci_irq_line = 0;
+static unsigned int pci_irq_line;
int ne_probe(struct net_device *dev);
static int ne_probe1(struct net_device *dev, int ioaddr);
@@ -204,13 +204,9 @@
#ifndef MODULE
/* Last resort. The semi-risky ISA auto-probe. */
- for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
- int ioaddr = netcard_portlist[base_addr];
- if (check_region(ioaddr, NE_IO_EXTENT))
- continue;
- if (ne_probe1(dev, ioaddr) == 0)
+ for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++)
+ if (ne_probe1(dev, netcard_portlist[base_addr]) == 0)
return 0;
- }
#endif
return -ENODEV;
@@ -229,9 +225,6 @@
if (pci_enable_device(pdev))
continue;
pci_ioaddr = pci_resource_start (pdev, 0);
- /* Avoid already found cards from previous calls */
- if (check_region(pci_ioaddr, NE_IO_EXTENT))
- continue;
pci_irq_line = pdev->irq;
if (pci_irq_line) break; /* Found it */
}
@@ -295,17 +288,22 @@
static int __init ne_probe1(struct net_device *dev, int ioaddr)
{
- int i;
+ int i, retval;
unsigned char SA_prom[32];
int wordlength = 2;
const char *name = NULL;
int start_page, stop_page;
int neX000, ctron, copam, bad_card;
- int reg0 = inb_p(ioaddr);
- static unsigned version_printed = 0;
+ int reg0;
+ static unsigned version_printed;
+
+ if (!request_region(ioaddr, NE_IO_EXTENT, dev->name))
+ return -EBUSY;
- if (reg0 == 0xFF)
- return -ENODEV;
+ if ((reg0 = inb_p(ioaddr)) == 0xFF) {
+ retval = -ENODEV;
+ goto out;
+ }
/* Do a preliminary verification that we have a 8390. */
{
@@ -318,7 +316,8 @@
if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
outb_p(reg0, ioaddr);
outb_p(regd, ioaddr + 0x0d); /* Restore the old values. */
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
}
@@ -350,7 +349,8 @@
break;
} else {
printk(" not found (no reset ack).\n");
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
}
@@ -452,11 +452,13 @@
{
printk(" not found (invalid signature %2.2x %2.2x).\n",
SA_prom[14], SA_prom[15]);
- return -ENXIO;
+ retval = -ENXIO;
+ goto out;
}
#else
printk(" not found.\n");
- return -ENXIO;
+ retval = -ENXIO;
+ goto out;
#endif
}
@@ -482,31 +484,30 @@
if (! dev->irq) {
printk(" failed to detect IRQ line.\n");
- return -EAGAIN;
+ retval = -EAGAIN;
+ goto out;
}
/* Allocate dev->priv and fill in 8390 specific dev fields. */
if (ethdev_init(dev))
{
printk (" unable to get memory for dev->priv.\n");
- return -ENOMEM;
+ retval = -ENOMEM;
+ goto out;
}
/* Snarf the interrupt now. There's no point in waiting since we cannot
share and the board will usually be enabled. */
-
- {
- int irqval = request_irq(dev->irq, ei_interrupt,
- pci_irq_line ? SA_SHIRQ : 0, name, dev);
- if (irqval) {
- printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval);
- kfree(dev->priv);
- dev->priv = NULL;
- return -EAGAIN;
- }
+ retval = request_irq(dev->irq, ei_interrupt,
+ pci_irq_line ? SA_SHIRQ : 0, dev->name, dev);
+ if (retval) {
+ printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, retval);
+ kfree(dev->priv);
+ dev->priv = NULL;
+ goto out;
}
+
dev->base_addr = ioaddr;
- request_region(ioaddr, NE_IO_EXTENT, name);
for(i = 0; i < ETHER_ADDR_LEN; i++) {
printk(" %2.2x", SA_prom[i]);
@@ -536,6 +537,9 @@
dev->stop = &ne_close;
NS8390_init(dev, 0);
return 0;
+out:
+ release_region(ioaddr, NE_IO_EXTENT);
+ return retval;
}
static int ne_open(struct net_device *dev)
[-- Attachment #10: patch-wd --]
[-- Type: text/plain, Size: 2350 bytes --]
diff -urN /mnt/disk/linux/drivers/net/wd.c /linux/drivers/net/wd.c
--- /mnt/disk/linux/drivers/net/wd.c Thu Nov 2 22:00:58 2000
+++ /linux/drivers/net/wd.c Sat Nov 4 19:18:03 2000
@@ -91,32 +91,33 @@
else if (base_addr != 0) /* Don't probe at all. */
return -ENXIO;
- for (i = 0; wd_portlist[i]; i++) {
- int ioaddr = wd_portlist[i];
- if (check_region(ioaddr, WD_IO_EXTENT))
- continue;
- if (wd_probe1(dev, ioaddr) == 0)
+ for (i = 0; wd_portlist[i]; i++)
+ if (wd_probe1(dev, wd_portlist[i]) == 0)
return 0;
- }
return -ENODEV;
}
static int __init wd_probe1(struct net_device *dev, int ioaddr)
{
- int i;
+ int i, retval;
int checksum = 0;
int ancient = 0; /* An old card without config registers. */
int word16 = 0; /* 0 = 8 bit, 1 = 16 bit */
const char *model_name;
- static unsigned version_printed = 0;
+ static unsigned version_printed;
+
+ if (!request_region(ioaddr, WD_IO_EXTENT, dev->name))
+ return -EBUSY;
for (i = 0; i < 8; i++)
checksum += inb(ioaddr + 8 + i);
if (inb(ioaddr + 8) == 0xff /* Extra check to avoid soundcard. */
|| inb(ioaddr + 9) == 0xff
- || (checksum & 0xff) != 0xFF)
- return -ENODEV;
+ || (checksum & 0xff) != 0xFF) {
+ retval = -ENODEV;
+ goto out;
+ }
/* Check for semi-valid mem_start/end values if supplied. */
if ((dev->mem_start % 0x2000) || (dev->mem_end % 0x2000)) {
@@ -243,21 +244,20 @@
/* Allocate dev->priv and fill in 8390 specific dev fields. */
if (ethdev_init(dev)) {
printk (" unable to get memory for dev->priv.\n");
- return -ENOMEM;
+ retval = -ENOMEM;
+ goto out;
}
/* Snarf the interrupt now. There's no point in waiting since we cannot
share and the board will usually be enabled. */
- if (request_irq(dev->irq, ei_interrupt, 0, model_name, dev)) {
+ if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
printk (" unable to get IRQ %d.\n", dev->irq);
kfree(dev->priv);
dev->priv = NULL;
- return -EAGAIN;
+ goto out;
}
/* OK, were are certain this is going to work. Setup the device. */
- request_region(ioaddr, WD_IO_EXTENT, model_name);
-
ei_status.name = model_name;
ei_status.word16 = word16;
ei_status.tx_start_page = WD_START_PG;
@@ -294,6 +294,9 @@
#endif
return 0;
+out:
+ release_region(ioaddr, WD_IO_EXTENT);
+ return retval;
}
static int
reply other threads:[~2000-11-08 15:03 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20001108180517.B4729@debian \
--to=pazke@orbita.don.sitek.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).