History

Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

Pull crypto fixes from Herbert Xu: "This fixes regressions in the crypto ccp driver and the hwrng drivers for amd and geode" * 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: hwrng: geode - Revert managed API changes hwrng: amd - Revert managed API changes crypto: ccp - Assign DMA commands to the channel's CCP

Linus Torvalds committed 9 years ago

Commit e8fe23f2 parents 213e4eb 8c757045 files · +75 −25Browse files

Unified · Split

5 files
  1. drivers/char/hw_random/amd-rng.c +34 −8
  2. drivers/char/hw_random/geode-rng.c +35 −15
  3. drivers/crypto/ccp/ccp-dev.c +4 −1
  4. drivers/crypto/ccp/ccp-dmaengine.c +1 −0
  5. include/linux/ccp.h +1 −1
drivers/char/hw_random/amd-rng.c+34−8
@@ -55,6 +55,7 @@ MODULE_DEVICE_TABLE(pci, pci_tbl); · 54 unmodified lines
55struct amd768_priv {55struct amd768_priv {
56 void __iomem *iobase;56 void __iomem *iobase;
57 struct pci_dev *pcidev;57 struct pci_dev *pcidev;
58 u32 pmbase;
58};59};
59 60
60static int amd_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)61static int amd_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
@@ -148,33 +149,58 @@ found: · 87 unmodified lines
148 if (pmbase == 0)149 if (pmbase == 0)
149 return -EIO;150 return -EIO;
150 151
151 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);152 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
152 if (!priv)153 if (!priv)
153 return -ENOMEM;154 return -ENOMEM;
154 155
155 if (!devm_request_region(&pdev->dev, pmbase + PMBASE_OFFSET,156 if (!request_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE, DRV_NAME)) {
156 PMBASE_SIZE, DRV_NAME)) {
157 dev_err(&pdev->dev, DRV_NAME " region 0x%x already in use!\n",157 dev_err(&pdev->dev, DRV_NAME " region 0x%x already in use!\n",
158 pmbase + 0xF0);158 pmbase + 0xF0);
159 return -EBUSY;159 err = -EBUSY;
160 goto out;
160 }161 }
161 162
162 priv->iobase = devm_ioport_map(&pdev->dev, pmbase + PMBASE_OFFSET,163 priv->iobase = ioport_map(pmbase + PMBASE_OFFSET, PMBASE_SIZE);
163 PMBASE_SIZE);
164 if (!priv->iobase) {164 if (!priv->iobase) {
165 pr_err(DRV_NAME "Cannot map ioport\n");165 pr_err(DRV_NAME "Cannot map ioport\n");
166 return -ENOMEM;166 err = -EINVAL;
167 goto err_iomap;
167 }168 }
168 169
169 amd_rng.priv = (unsigned long)priv;170 amd_rng.priv = (unsigned long)priv;
171 priv->pmbase = pmbase;
170 priv->pcidev = pdev;172 priv->pcidev = pdev;
171 173
172 pr_info(DRV_NAME " detected\n");174 pr_info(DRV_NAME " detected\n");
173 return devm_hwrng_register(&pdev->dev, &amd_rng);175 err = hwrng_register(&amd_rng);
176 if (err) {
177 pr_err(DRV_NAME " registering failed (%d)\n", err);
178 goto err_hwrng;
179 }
180 return 0;
181
182err_hwrng:
183 ioport_unmap(priv->iobase);
184err_iomap:
185 release_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE);
186out:
187 kfree(priv);
188 return err;
174}189}
175 190
176static void __exit mod_exit(void)191static void __exit mod_exit(void)
177{192{
193 struct amd768_priv *priv;
194
195 priv = (struct amd768_priv *)amd_rng.priv;
196
197 hwrng_unregister(&amd_rng);
198
199 ioport_unmap(priv->iobase);
200
201 release_region(priv->pmbase + PMBASE_OFFSET, PMBASE_SIZE);
202
203 kfree(priv);
178}204}
179 205
180module_init(mod_init);206module_init(mod_init);
drivers/char/hw_random/geode-rng.c+35−15
@@ -31,6 +31,9 @@ · 30 unmodified lines
31#include <linux/module.h>31#include <linux/module.h>
32#include <linux/pci.h>32#include <linux/pci.h>
33 33
34
35#define PFX KBUILD_MODNAME ": "
36
34#define GEODE_RNG_DATA_REG 0x5037#define GEODE_RNG_DATA_REG 0x50
35#define GEODE_RNG_STATUS_REG 0x5438#define GEODE_RNG_STATUS_REG 0x54
36 39
@@ -82,6 +85,7 @@ static struct hwrng geode_rng = { · 45 unmodified lines
82 85
83static int __init mod_init(void)86static int __init mod_init(void)
84{87{
88 int err = -ENODEV;
85 struct pci_dev *pdev = NULL;89 struct pci_dev *pdev = NULL;
86 const struct pci_device_id *ent;90 const struct pci_device_id *ent;
87 void __iomem *mem;91 void __iomem *mem;
@@ -89,27 +93,43 @@ static int __init mod_init(void) · 1 unmodified line
89 93
90 for_each_pci_dev(pdev) {94 for_each_pci_dev(pdev) {
91 ent = pci_match_id(pci_tbl, pdev);95 ent = pci_match_id(pci_tbl, pdev);
92 if (ent) {96 if (ent)
93 rng_base = pci_resource_start(pdev, 0);97 goto found;
94 if (rng_base == 0)
95 return -ENODEV;
96
97 mem = devm_ioremap(&pdev->dev, rng_base, 0x58);
98 if (!mem)
99 return -ENOMEM;
100 geode_rng.priv = (unsigned long)mem;
101
102 pr_info("AMD Geode RNG detected\n");
103 return devm_hwrng_register(&pdev->dev, &geode_rng);
104 }
105 }98 }
106
107 /* Device not found. */99 /* Device not found. */
108 return -ENODEV;100 goto out;
101
102found:
103 rng_base = pci_resource_start(pdev, 0);
104 if (rng_base == 0)
105 goto out;
106 err = -ENOMEM;
107 mem = ioremap(rng_base, 0x58);
108 if (!mem)
109 goto out;
110 geode_rng.priv = (unsigned long)mem;
111
112 pr_info("AMD Geode RNG detected\n");
113 err = hwrng_register(&geode_rng);
114 if (err) {
115 pr_err(PFX "RNG registering failed (%d)\n",
116 err);
117 goto err_unmap;
118 }
119out:
120 return err;
121
122err_unmap:
123 iounmap(mem);
124 goto out;
109}125}
110 126
111static void __exit mod_exit(void)127static void __exit mod_exit(void)
112{128{
129 void __iomem *mem = (void __iomem *)geode_rng.priv;
130
131 hwrng_unregister(&geode_rng);
132 iounmap(mem);
113}133}
114 134
115module_init(mod_init);135module_init(mod_init);
drivers/crypto/ccp/ccp-dev.c+4−1
@@ -283,11 +283,14 @@ EXPORT_SYMBOL_GPL(ccp_version); · 282 unmodified lines
283 */283 */
284int ccp_enqueue_cmd(struct ccp_cmd *cmd)284int ccp_enqueue_cmd(struct ccp_cmd *cmd)
285{285{
286 struct ccp_device *ccp = ccp_get_device();286 struct ccp_device *ccp;
287 unsigned long flags;287 unsigned long flags;
288 unsigned int i;288 unsigned int i;
289 int ret;289 int ret;
290 290
291 /* Some commands might need to be sent to a specific device */
292 ccp = cmd->ccp ? cmd->ccp : ccp_get_device();
293
291 if (!ccp)294 if (!ccp)
292 return -ENODEV;295 return -ENODEV;
293 296
drivers/crypto/ccp/ccp-dmaengine.c+1−0
@@ -390,6 +390,7 @@ static struct ccp_dma_desc *ccp_create_desc(struct dma_chan *dma_chan, · 389 unmodified lines
390 goto err;390 goto err;
391 391
392 ccp_cmd = &cmd->ccp_cmd;392 ccp_cmd = &cmd->ccp_cmd;
393 ccp_cmd->ccp = chan->ccp;
393 ccp_pt = &ccp_cmd->u.passthru_nomap;394 ccp_pt = &ccp_cmd->u.passthru_nomap;
394 ccp_cmd->flags = CCP_CMD_MAY_BACKLOG;395 ccp_cmd->flags = CCP_CMD_MAY_BACKLOG;
395 ccp_cmd->flags |= CCP_CMD_PASSTHRU_NO_DMA_MAP;396 ccp_cmd->flags |= CCP_CMD_PASSTHRU_NO_DMA_MAP;
include/linux/ccp.h+1−1
@@ -556,7 +556,7 @@ enum ccp_engine { · 555 unmodified lines
556 * struct ccp_cmd - CCP operation request556 * struct ccp_cmd - CCP operation request
557 * @entry: list element (ccp driver use only)557 * @entry: list element (ccp driver use only)
558 * @work: work element used for callbacks (ccp driver use only)558 * @work: work element used for callbacks (ccp driver use only)
559 * @ccp: CCP device to be run on (ccp driver use only)559 * @ccp: CCP device to be run on
560 * @ret: operation return code (ccp driver use only)560 * @ret: operation return code (ccp driver use only)
561 * @flags: cmd processing flags561 * @flags: cmd processing flags
562 * @engine: CCP operation to perform562 * @engine: CCP operation to perform