)]}'
{
  "log": [
    {
      "commit": "60a74a6ff86b4e90b9558956589390efdeb4e924",
      "tree": "188cfc02511b8e8a21e324efd9046f9e5b8c097a",
      "parents": [
        "9993e0fe0f5f29c69e79efcb271ffc9843002985"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Sat Oct 23 13:18:56 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Sun Dec 12 15:47:02 2010 +0100"
      },
      "message": "firewire: nosy: char device is not seekable\n\nAmend .open handler accordingly and remove the .llseek handler.\n.llseek \u003d NULL means no_llseek (return error) since commit 776c163b1b93.\n\nThe only client that uses this interface is nosy-dump in linux/tools/firewire\nand it knows not to seek in this char dev.\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "6038f373a3dc1f1c26496e60b6c40b164716f07e",
      "tree": "a0d3bbd026eea41b9fc36b8c722cbaf56cd9f825",
      "parents": [
        "1ec5584e3edf9c4bf2c88c846534d19cf986ba11"
      ],
      "author": {
        "name": "Arnd Bergmann",
        "email": "arnd@arndb.de",
        "time": "Sun Aug 15 18:52:59 2010 +0200"
      },
      "committer": {
        "name": "Arnd Bergmann",
        "email": "arnd@arndb.de",
        "time": "Fri Oct 15 15:53:27 2010 +0200"
      },
      "message": "llseek: automatically add .llseek fop\n\nAll file_operations should get a .llseek operation so we can make\nnonseekable_open the default for future file operations without a\n.llseek pointer.\n\nThe three cases that we can automatically detect are no_llseek, seq_lseek\nand default_llseek. For cases where we can we can automatically prove that\nthe file offset is always ignored, we use noop_llseek, which maintains\nthe current behavior of not returning an error from a seek.\n\nNew drivers should normally not use noop_llseek but instead use no_llseek\nand call nonseekable_open at open time.  Existing drivers can be converted\nto do the same when the maintainer knows for certain that no user code\nrelies on calling seek on the device file.\n\nThe generated code is often incorrectly indented and right now contains\ncomments that clarify for each added line why a specific variant was\nchosen. In the version that gets submitted upstream, the comments will\nbe gone and I will manually fix the indentation, because there does not\nseem to be a way to do that using coccinelle.\n\nSome amount of new code is currently sitting in linux-next that should get\nthe same modifications, which I will do at the end of the merge window.\n\nMany thanks to Julia Lawall for helping me learn to write a semantic\npatch that does all this.\n\n\u003d\u003d\u003d\u003d\u003d begin semantic patch \u003d\u003d\u003d\u003d\u003d\n// This adds an llseek\u003d method to all file operations,\n// as a preparation for making no_llseek the default.\n//\n// The rules are\n// - use no_llseek explicitly if we do nonseekable_open\n// - use seq_lseek for sequential files\n// - use default_llseek if we know we access f_pos\n// - use noop_llseek if we know we don\u0027t access f_pos,\n//   but we still want to allow users to call lseek\n//\n@ open1 exists @\nidentifier nested_open;\n@@\nnested_open(...)\n{\n\u003c+...\nnonseekable_open(...)\n...+\u003e\n}\n\n@ open exists@\nidentifier open_f;\nidentifier i, f;\nidentifier open1.nested_open;\n@@\nint open_f(struct inode *i, struct file *f)\n{\n\u003c+...\n(\nnonseekable_open(...)\n|\nnested_open(...)\n)\n...+\u003e\n}\n\n@ read disable optional_qualifier exists @\nidentifier read_f;\nidentifier f, p, s, off;\ntype ssize_t, size_t, loff_t;\nexpression E;\nidentifier func;\n@@\nssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)\n{\n\u003c+...\n(\n   *off \u003d E\n|\n   *off +\u003d E\n|\n   func(..., off, ...)\n|\n   E \u003d *off\n)\n...+\u003e\n}\n\n@ read_no_fpos disable optional_qualifier exists @\nidentifier read_f;\nidentifier f, p, s, off;\ntype ssize_t, size_t, loff_t;\n@@\nssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)\n{\n... when !\u003d off\n}\n\n@ write @\nidentifier write_f;\nidentifier f, p, s, off;\ntype ssize_t, size_t, loff_t;\nexpression E;\nidentifier func;\n@@\nssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)\n{\n\u003c+...\n(\n  *off \u003d E\n|\n  *off +\u003d E\n|\n  func(..., off, ...)\n|\n  E \u003d *off\n)\n...+\u003e\n}\n\n@ write_no_fpos @\nidentifier write_f;\nidentifier f, p, s, off;\ntype ssize_t, size_t, loff_t;\n@@\nssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)\n{\n... when !\u003d off\n}\n\n@ fops0 @\nidentifier fops;\n@@\nstruct file_operations fops \u003d {\n ...\n};\n\n@ has_llseek depends on fops0 @\nidentifier fops0.fops;\nidentifier llseek_f;\n@@\nstruct file_operations fops \u003d {\n...\n .llseek \u003d llseek_f,\n...\n};\n\n@ has_read depends on fops0 @\nidentifier fops0.fops;\nidentifier read_f;\n@@\nstruct file_operations fops \u003d {\n...\n .read \u003d read_f,\n...\n};\n\n@ has_write depends on fops0 @\nidentifier fops0.fops;\nidentifier write_f;\n@@\nstruct file_operations fops \u003d {\n...\n .write \u003d write_f,\n...\n};\n\n@ has_open depends on fops0 @\nidentifier fops0.fops;\nidentifier open_f;\n@@\nstruct file_operations fops \u003d {\n...\n .open \u003d open_f,\n...\n};\n\n// use no_llseek if we call nonseekable_open\n////////////////////////////////////////////\n@ nonseekable1 depends on !has_llseek \u0026\u0026 has_open @\nidentifier fops0.fops;\nidentifier nso ~\u003d \"nonseekable_open\";\n@@\nstruct file_operations fops \u003d {\n...  .open \u003d nso, ...\n+.llseek \u003d no_llseek, /* nonseekable */\n};\n\n@ nonseekable2 depends on !has_llseek @\nidentifier fops0.fops;\nidentifier open.open_f;\n@@\nstruct file_operations fops \u003d {\n...  .open \u003d open_f, ...\n+.llseek \u003d no_llseek, /* open uses nonseekable */\n};\n\n// use seq_lseek for sequential files\n/////////////////////////////////////\n@ seq depends on !has_llseek @\nidentifier fops0.fops;\nidentifier sr ~\u003d \"seq_read\";\n@@\nstruct file_operations fops \u003d {\n...  .read \u003d sr, ...\n+.llseek \u003d seq_lseek, /* we have seq_read */\n};\n\n// use default_llseek if there is a readdir\n///////////////////////////////////////////\n@ fops1 depends on !has_llseek \u0026\u0026 !nonseekable1 \u0026\u0026 !nonseekable2 \u0026\u0026 !seq @\nidentifier fops0.fops;\nidentifier readdir_e;\n@@\n// any other fop is used that changes pos\nstruct file_operations fops \u003d {\n... .readdir \u003d readdir_e, ...\n+.llseek \u003d default_llseek, /* readdir is present */\n};\n\n// use default_llseek if at least one of read/write touches f_pos\n/////////////////////////////////////////////////////////////////\n@ fops2 depends on !fops1 \u0026\u0026 !has_llseek \u0026\u0026 !nonseekable1 \u0026\u0026 !nonseekable2 \u0026\u0026 !seq @\nidentifier fops0.fops;\nidentifier read.read_f;\n@@\n// read fops use offset\nstruct file_operations fops \u003d {\n... .read \u003d read_f, ...\n+.llseek \u003d default_llseek, /* read accesses f_pos */\n};\n\n@ fops3 depends on !fops1 \u0026\u0026 !fops2 \u0026\u0026 !has_llseek \u0026\u0026 !nonseekable1 \u0026\u0026 !nonseekable2 \u0026\u0026 !seq @\nidentifier fops0.fops;\nidentifier write.write_f;\n@@\n// write fops use offset\nstruct file_operations fops \u003d {\n... .write \u003d write_f, ...\n+\t.llseek \u003d default_llseek, /* write accesses f_pos */\n};\n\n// Use noop_llseek if neither read nor write accesses f_pos\n///////////////////////////////////////////////////////////\n\n@ fops4 depends on !fops1 \u0026\u0026 !fops2 \u0026\u0026 !fops3 \u0026\u0026 !has_llseek \u0026\u0026 !nonseekable1 \u0026\u0026 !nonseekable2 \u0026\u0026 !seq @\nidentifier fops0.fops;\nidentifier read_no_fpos.read_f;\nidentifier write_no_fpos.write_f;\n@@\n// write fops use offset\nstruct file_operations fops \u003d {\n...\n .write \u003d write_f,\n .read \u003d read_f,\n...\n+.llseek \u003d noop_llseek, /* read and write both use no f_pos */\n};\n\n@ depends on has_write \u0026\u0026 !has_read \u0026\u0026 !fops1 \u0026\u0026 !fops2 \u0026\u0026 !has_llseek \u0026\u0026 !nonseekable1 \u0026\u0026 !nonseekable2 \u0026\u0026 !seq @\nidentifier fops0.fops;\nidentifier write_no_fpos.write_f;\n@@\nstruct file_operations fops \u003d {\n... .write \u003d write_f, ...\n+.llseek \u003d noop_llseek, /* write uses no f_pos */\n};\n\n@ depends on has_read \u0026\u0026 !has_write \u0026\u0026 !fops1 \u0026\u0026 !fops2 \u0026\u0026 !has_llseek \u0026\u0026 !nonseekable1 \u0026\u0026 !nonseekable2 \u0026\u0026 !seq @\nidentifier fops0.fops;\nidentifier read_no_fpos.read_f;\n@@\nstruct file_operations fops \u003d {\n... .read \u003d read_f, ...\n+.llseek \u003d noop_llseek, /* read uses no f_pos */\n};\n\n@ depends on !has_read \u0026\u0026 !has_write \u0026\u0026 !fops1 \u0026\u0026 !fops2 \u0026\u0026 !has_llseek \u0026\u0026 !nonseekable1 \u0026\u0026 !nonseekable2 \u0026\u0026 !seq @\nidentifier fops0.fops;\n@@\nstruct file_operations fops \u003d {\n...\n+.llseek \u003d noop_llseek, /* no read or write fn */\n};\n\u003d\u003d\u003d\u003d\u003d End semantic patch \u003d\u003d\u003d\u003d\u003d\n\nSigned-off-by: Arnd Bergmann \u003carnd@arndb.de\u003e\nCc: Julia Lawall \u003cjulia@diku.dk\u003e\nCc: Christoph Hellwig \u003chch@infradead.org\u003e\n"
    },
    {
      "commit": "7429b17d30a19fd52a0c07de9d3959746d321e15",
      "tree": "2dc1e07547893ed804fd06b84eb24a86a38cc571",
      "parents": [
        "fd8c8d46ca9402c15383d2cf0bc3ee7740de3b62"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:11 2010 +0200"
      },
      "message": "firewire: nosy: use generic printk macros\n\nReplace home-grown printk wrapper macros by ones from kernel.h and\ndevice.h.\n\nAlso raise the log level in set_phy_reg() from debug to error because\nthese are really error conditions.  Could even be WARN_ON.  Lower the\nlog level in the device probe and driver shutdown from notice to info.\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "fd8c8d46ca9402c15383d2cf0bc3ee7740de3b62",
      "tree": "66a33db3ea837f2fb6c66e077a9b5fae7009c3ba",
      "parents": [
        "c89db7b8bc88d8288dcfbe7a885b950d2560d564"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:11 2010 +0200"
      },
      "message": "firewire: nosy: endianess fixes and annotations\n\n1.)  The DMA programs (struct pcl) are PCI-endian \u003d little endian data\n(except for the 3rd quadlet in a PCL which the controller does not\ntouch).  Annotate them as such.\n\nFix all accesses of the PCL to work with big endian CPUs also.  Not\nactually tested, I only have a little endian PC to test with.  This\nincludes replacement of a bitfield struct pcl_status by open-coded\nshift and mask operations.\n\n2.)  The two __attribute__ ((packed)) at struct pcl are not really\nrequired since it consists of u32/__le32 only, i.e. there will be no\npadding with or without the attribute.\n\n3.)  The received IEEE 1394 data are byteswapped by the controller from\nIEEE 1394 endian \u003d big endian to PCI endian \u003d little endian because the\nPCL_BIGENDIAN control bit is set.  Therefore annotate the DMA buffer as\na __le32 array.\n\nFix the one access of the DMA buffer (the check of the transaction code\nof link packets) to work with big endian CPUs.  Also fix the two\naccesses of the client bounce buffer (the reading of packet length).\n\n4.)  Add a comment to the userspace ABI header that all of the data gets\nout as little endian data, except for the timestamp which is CPU endian.\n(We could make it little endian too, but why?  Vice versa, an ioctl\ncould be added to dump packet data in big endian byte order...)\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "c89db7b8bc88d8288dcfbe7a885b950d2560d564",
      "tree": "b6588c1c885f6219a55aff794681e39062408ad4",
      "parents": [
        "424d66cedae8bebb00fdb917fc8430f7b8a655cf"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:11 2010 +0200"
      },
      "message": "firewire: nosy: annotate __user pointers and __iomem pointers\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "424d66cedae8bebb00fdb917fc8430f7b8a655cf",
      "tree": "cd232df29974be404978d47a2257c9422272d304",
      "parents": [
        "b6d9c125e6610591c04ca9045f641e35ce1a9226"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:11 2010 +0200"
      },
      "message": "firewire: nosy: fix device shutdown with active client\n\nFix race between nosy_open() and remove_card() by replacing the\nunprotected array of card pointers by a mutex-protected list of cards.\n\nMake card instances reference-counted and let each client hold a\nreference.\n\nNotify clients about card removal via POLLHUP in poll()\u0027s events\nbitmap; also let read() fail with errno\u003dENODEV if the card was removed\nand everything in the buffer was read.\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "b6d9c125e6610591c04ca9045f641e35ce1a9226",
      "tree": "416672c79a3ee4b0764561ba5ebcf9ed3ba4d5c7",
      "parents": [
        "165476671f731b4c3d6cf401d0e1886f4a4f4a8e"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:10 2010 +0200"
      },
      "message": "firewire: nosy: handle errors in device probe\n\nand add a missing pci_disable_device() to device shutdown.\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "165476671f731b4c3d6cf401d0e1886f4a4f4a8e",
      "tree": "59bba3913c7bb3a023394bce86bb0ea79d95f1ed",
      "parents": [
        "55e77c06c6017a70630cf599770369b8ba07c841"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:10 2010 +0200"
      },
      "message": "firewire: nosy: fix IRQ handler for card ejection\n\nUntested, I don\u0027t have a PCILynx CardBus card.\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "55e77c06c6017a70630cf599770369b8ba07c841",
      "tree": "5fe5940bd0e0326afad0898b521490b53c894adf",
      "parents": [
        "685c3f80b6d88478a6428676f9daab59faf3cd4b"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:10 2010 +0200"
      },
      "message": "firewire: nosy: unroll some simple functions\n\nnosy_start/stop_snoop() and nosy_add/remove_client() are simple enough\nto be inlined into their callers.\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "685c3f80b6d88478a6428676f9daab59faf3cd4b",
      "tree": "3f1f93927c0241ba12d887bcf7b90fc52d760884",
      "parents": [
        "a2d39db9dec0e7e403f54c9cf98b7dbc82b4c44a"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:10 2010 +0200"
      },
      "message": "firewire: nosy: use flagless variants of spinlock accessors\n\nnosy_start/stop_snoop() are always only called by the ioctl method, i.e.\nwith IRQs enabled.  packet_handler() and bus_reset_handler() are always\nonly called by the IRQ handler.  Hence neither one needs to track IRQ\nflags.\n\nTo underline the call context of packet_handler() and\nbus_reset_handler(), rename these functions to *_irq_handler().\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "a2d39db9dec0e7e403f54c9cf98b7dbc82b4c44a",
      "tree": "86e4e8447f83cefa4ae4809051fffad04b8229ef",
      "parents": [
        "c7b2a99c66e7b40d8843a70f2981e375eeedf062"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:10 2010 +0200"
      },
      "message": "firewire: nosy: fix list corruption by NOSY_IOC_STOP\n\nnosy_stop_snoop() would blow up the second time it was called without\nnosy_start_snoop() in between.\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "c7b2a99c66e7b40d8843a70f2981e375eeedf062",
      "tree": "56039d14506b685e009f0b501264cba08d3e5484",
      "parents": [
        "b5e47729043c9224b21ab3dc7c63e8a38dbb4923"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Thu Jul 22 11:56:38 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:10 2010 +0200"
      },
      "message": "firewire: nosy: convert to unlocked ioctl\n\nThe required serialization of NOSY_IOC_START and NOSY_IOC_STOP is\nalready provided by the client_list_lock.\n\nNOSY_IOC_FILTER does not really require serialization since accesses\nto tcode_mask are atomic on any sane CPU architecture.  Nevertheless,\nmake it explicit that we want this to be atomic by means of\nclient_list_lock (which also surrounds the other tcode_mask access in\nthe IRQ handler).  While we are at it, change the type of tcode_mask to\nu32 for consistency with the user API.\n\nNOSY_IOC_GET_STATS does not require serialization against itself.  But\nthere is a bug here regarding concurrent updates of the two counters\nby the IRQ handler.  Fix it by taking the client_list_lock in this ioctl\ntoo.\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "b5e47729043c9224b21ab3dc7c63e8a38dbb4923",
      "tree": "2acf6aa0f441c3a6b8812c8c5eb3b97a74f98056",
      "parents": [
        "286468210d83ce0ca1e37e346ed9f4457a161650"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 10:28:30 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:10 2010 +0200"
      },
      "message": "firewire: nosy: misc cleanups\n\nExtend copyright note to 2007, c.f. Kristian\u0027s git log.\n\nIncludes:\n  - replace some \u003casm/*.h\u003e by \u003clinux/*.h\u003e\n  - add required indirectly included \u003clinux/spinlock.h\u003e\n  - order alphabetically\n\nCoding style related changes:\n  - change to utf8\n  - normalize whitespace\n  - normalize comment style\n  - remove usages of __FUNCTION__\n  - remove an unnecessary cast from void *\n\nConst and static declarations:\n  - driver_name is not const in pci_driver.name, drop const qualifier\n  - driver_name can be taken from KBUILD_MODNAME\n  - the global variable minors[] can and should be static\n  - constify struct file_operations instance\n\nData types:\n  - Remove unused struct member struct packet.code.  struct packet is\n    only used for driver-internal bookkeeping; it does not appear on the\n    wire or in DMA programs or the userspace ABI.  Hence the unused\n    member .code can be removed without worries.\n\nPreprocessor macros:\n  - unroll a preprocessor macro that containd a return\n  - use list_for_each_entry\n\nPrintk:\n  - add missing terminating \\n in some format strings\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\n"
    },
    {
      "commit": "286468210d83ce0ca1e37e346ed9f4457a161650",
      "tree": "e445a09a6a074e3ae65479e417d41d4d1c41f571",
      "parents": [
        "e40152ee1e1c7a63f4777791863215e3faa37a86"
      ],
      "author": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 10:26:33 2010 +0200"
      },
      "committer": {
        "name": "Stefan Richter",
        "email": "stefanr@s5r6.in-berlin.de",
        "time": "Tue Jul 27 11:04:10 2010 +0200"
      },
      "message": "firewire: new driver: nosy - IEEE 1394 traffic sniffer\n\nThis adds the traffic sniffer driver for Texas Instruments PCILynx/\nPCILynx2 based cards.  The use cases for nosy are analysis of\nnonstandard protocols and as an aid in development of drivers,\napplications, or firmwares.\n\nAuthor of the driver is Kristian Høgsberg.  Known contributers are\nJody McIntyre and Jonathan Woithe.\n\nNosy programs PCILynx chips to operate in promiscuous mode, which is a\nfeature that is not found in OHCI-1394 controllers.  Hence, only special\nhardware as mentioned in the Kconfig help text is suitable for nosy.\n\nThis is only the kernelspace part of nosy.  There is a userspace\ninterface to it, called nosy-dump, proposed to be added into the tools/\nsubdirectory of the kernel sources in a subsequent change.  Kernelspace\nand userspave component of nosy communicate via a \u0027misc\u0027 character\ndevice file called /dev/nosy with a simple ioctl() and read() based\nprotocol, as described by nosy-user.h.\n\nThe files added here are taken from\ngit://anongit.freedesktop.org/~krh/nosy commit ee29be97 (2009-11-10)\nwith the following changes by Stefan Richter:\n  - Kconfig and Makefile hunks are written from scratch.\n  - Commented out version printk in nosy.c.\n  - Included missing \u003clinux/sched.h\u003e, reported by Stephen Rothwell.\n\n\"git shortlog nosy{-user.h,.c,.h}\" from nosy\u0027s git repository:\n\nJonathan Woithe (2):\n      Nosy updates for recent kernels\n      Fix uninitialised memory (needed for 2.6.31 kernel)\n\nKristian Høgsberg (5):\n      Pull over nosy from mercurial repo.\n      Use a misc device instead.\n      Add simple AV/C decoder.\n      Don\u0027t break down on big payloads.\n      Set parent device for misc device.\n\nAs a low-level IEEE 1394 driver, its files are placed into\ndrivers/firewire/ although nosy is not part of the firewire driver\nstack.\n\nI am aware of the following literature from Texas Instruments about\nPCILynx programming:\n      SCPA020A - PCILynx 1394 to PCI Bus Interface TSB12LV21BPGF\n                 Functional Specification\n      SLLA023  - Initialization and Asynchronous Programming of the\n                 TSB12LV21A 1394 Device\n\nSigned-off-by: Stefan Richter \u003cstefanr@s5r6.in-berlin.de\u003e\nAcked-by: Kristian Høgsberg \u003ckrh@bitplanet.net\u003e\n"
    }
  ]
}
